Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 532b07d

Browse files
committed
feat: add solutions to lc problem: No.1737
No.1737.Change Minimum Characters to Satisfy One of Three Conditions
1 parent 0c0ed18 commit 532b07d

File tree

6 files changed

+377
-3
lines changed

6 files changed

+377
-3
lines changed

‎solution/1700-1799/1737.Change Minimum Characters to Satisfy One of Three Conditions/README.md‎

Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,17 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
前缀和
54+
**方法一:计数 + 枚举**
55+
56+
我们先统计字符串 $a$ 和 $b$ 中每个字母出现的次数,记为 $cnt_1$ 和 $cnt_2$。
57+
58+
然后考虑条件 3ドル,ドル即 $a$ 和 $b$ 中的每个字母都相同。我们只需要枚举最终的字母 $c,ドル然后统计 $a$ 和 $b$ 中不是 $c$ 的字母的个数,即为需要改变的字符个数。
59+
60+
然后考虑条件 1ドル$ 和 2ドル,ドル即 $a$ 中的每个字母都小于 $b$ 中的每个字母,或者 $b$ 中的每个字母都小于 $a$ 中的每个字母。对于条件 1ドル,ドル我们令字符串 $a$ 所有字符都小于字符 $c,ドル字符串 $b$ 所有字符都不小于 $c,ドル枚举 $c$ 找出最小的答案即可。条件 2ドル$ 同理。
61+
62+
最终的答案即为上述三种情况的最小值。
63+
64+
时间复杂度 $O(m + n + C^2),ドル其中 $m$ 和 $n$ 分别为字符串 $a$ 和 $b$ 的长度,而 $C$ 为字符集大小。本题中 $C = 26$。
5565

5666
<!-- tabs:start -->
5767

@@ -60,15 +70,139 @@
6070
<!-- 这里可写当前语言的特殊实现逻辑 -->
6171

6272
```python
63-
73+
class Solution:
74+
def minCharacters(self, a: str, b: str) -> int:
75+
def f(cnt1, cnt2):
76+
for i in range(1, 26):
77+
t = sum(cnt1[i:]) + sum(cnt2[:i])
78+
nonlocal ans
79+
ans = min(ans, t)
80+
81+
m, n = len(a), len(b)
82+
cnt1 = [0] * 26
83+
cnt2 = [0] * 26
84+
for c in a:
85+
cnt1[ord(c) - ord('a')] += 1
86+
for c in b:
87+
cnt2[ord(c) - ord('a')] += 1
88+
ans = m + n
89+
for c1, c2 in zip(cnt1, cnt2):
90+
ans = min(ans, m + n - c1 - c2)
91+
f(cnt1, cnt2)
92+
f(cnt2, cnt1)
93+
return ans
6494
```
6595

6696
### **Java**
6797

6898
<!-- 这里可写当前语言的特殊实现逻辑 -->
6999

70100
```java
101+
class Solution {
102+
private int ans;
103+
104+
public int minCharacters(String a, String b) {
105+
int m = a.length(), n = b.length();
106+
int[] cnt1 = new int[26];
107+
int[] cnt2 = new int[26];
108+
for (int i = 0; i < m; ++i) {
109+
++cnt1[a.charAt(i) - 'a'];
110+
}
111+
for (int i = 0; i < n; ++i) {
112+
++cnt2[b.charAt(i) - 'a'];
113+
}
114+
ans = m + n;
115+
for (int i = 0; i < 26; ++i) {
116+
ans = Math.min(ans, m + n - cnt1[i] - cnt2[i]);
117+
}
118+
f(cnt1, cnt2);
119+
f(cnt2, cnt1);
120+
return ans;
121+
}
71122

123+
private void f(int[] cnt1, int[] cnt2) {
124+
for (int i = 1; i < 26; ++i) {
125+
int t = 0;
126+
for (int j = i; j < 26; ++j) {
127+
t += cnt1[j];
128+
}
129+
for (int j = 0; j < i; ++j) {
130+
t += cnt2[j];
131+
}
132+
ans = Math.min(ans, t);
133+
}
134+
}
135+
}
136+
```
137+
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
int minCharacters(string a, string b) {
144+
int m = a.size(), n = b.size();
145+
vector<int> cnt1(26);
146+
vector<int> cnt2(26);
147+
for (char& c : a) ++cnt1[c - 'a'];
148+
for (char& c : b) ++cnt2[c - 'a'];
149+
int ans = m + n;
150+
for (int i = 0; i < 26; ++i) ans = min(ans, m + n - cnt1[i] - cnt2[i]);
151+
auto f = [&](vector<int>& cnt1, vector<int>& cnt2) {
152+
for (int i = 1; i < 26; ++i) {
153+
int t = 0;
154+
for (int j = i; j < 26; ++j) t += cnt1[j];
155+
for (int j = 0; j < i; ++j) t += cnt2[j];
156+
ans = min(ans, t);
157+
}
158+
};
159+
f(cnt1, cnt2);
160+
f(cnt2, cnt1);
161+
return ans;
162+
}
163+
};
164+
```
165+
166+
### **Go**
167+
168+
```go
169+
func minCharacters(a string, b string) int {
170+
cnt1 := [26]int{}
171+
cnt2 := [26]int{}
172+
for _, c := range a {
173+
cnt1[c-'a']++
174+
}
175+
for _, c := range b {
176+
cnt2[c-'a']++
177+
}
178+
m, n := len(a), len(b)
179+
ans := m + n
180+
for i := 0; i < 26; i++ {
181+
ans = min(ans, m+n-cnt1[i]-cnt2[i])
182+
}
183+
f := func(cnt1, cnt2 [26]int) {
184+
for i := 1; i < 26; i++ {
185+
t := 0
186+
for j := i; j < 26; j++ {
187+
t += cnt1[j]
188+
}
189+
for j := 0; j < i; j++ {
190+
t += cnt2[j]
191+
}
192+
ans = min(ans, t)
193+
}
194+
}
195+
f(cnt1, cnt2)
196+
f(cnt2, cnt1)
197+
return ans
198+
}
199+
200+
func min(a, b int) int {
201+
if a < b {
202+
return a
203+
}
204+
return b
205+
}
72206
```
73207

74208
### **TypeScript**

‎solution/1700-1799/1737.Change Minimum Characters to Satisfy One of Three Conditions/README_EN.md‎

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,137 @@ Prefix Sum
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def minCharacters(self, a: str, b: str) -> int:
59+
def f(cnt1, cnt2):
60+
for i in range(1, 26):
61+
t = sum(cnt1[i:]) + sum(cnt2[:i])
62+
nonlocal ans
63+
ans = min(ans, t)
64+
65+
m, n = len(a), len(b)
66+
cnt1 = [0] * 26
67+
cnt2 = [0] * 26
68+
for c in a:
69+
cnt1[ord(c) - ord('a')] += 1
70+
for c in b:
71+
cnt2[ord(c) - ord('a')] += 1
72+
ans = m + n
73+
for c1, c2 in zip(cnt1, cnt2):
74+
ans = min(ans, m + n - c1 - c2)
75+
f(cnt1, cnt2)
76+
f(cnt2, cnt1)
77+
return ans
5878
```
5979

6080
### **Java**
6181

6282
```java
83+
class Solution {
84+
private int ans;
85+
86+
public int minCharacters(String a, String b) {
87+
int m = a.length(), n = b.length();
88+
int[] cnt1 = new int[26];
89+
int[] cnt2 = new int[26];
90+
for (int i = 0; i < m; ++i) {
91+
++cnt1[a.charAt(i) - 'a'];
92+
}
93+
for (int i = 0; i < n; ++i) {
94+
++cnt2[b.charAt(i) - 'a'];
95+
}
96+
ans = m + n;
97+
for (int i = 0; i < 26; ++i) {
98+
ans = Math.min(ans, m + n - cnt1[i] - cnt2[i]);
99+
}
100+
f(cnt1, cnt2);
101+
f(cnt2, cnt1);
102+
return ans;
103+
}
104+
105+
private void f(int[] cnt1, int[] cnt2) {
106+
for (int i = 1; i < 26; ++i) {
107+
int t = 0;
108+
for (int j = i; j < 26; ++j) {
109+
t += cnt1[j];
110+
}
111+
for (int j = 0; j < i; ++j) {
112+
t += cnt2[j];
113+
}
114+
ans = Math.min(ans, t);
115+
}
116+
}
117+
}
118+
```
63119

120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
int minCharacters(string a, string b) {
126+
int m = a.size(), n = b.size();
127+
vector<int> cnt1(26);
128+
vector<int> cnt2(26);
129+
for (char& c : a) ++cnt1[c - 'a'];
130+
for (char& c : b) ++cnt2[c - 'a'];
131+
int ans = m + n;
132+
for (int i = 0; i < 26; ++i) ans = min(ans, m + n - cnt1[i] - cnt2[i]);
133+
auto f = [&](vector<int>& cnt1, vector<int>& cnt2) {
134+
for (int i = 1; i < 26; ++i) {
135+
int t = 0;
136+
for (int j = i; j < 26; ++j) t += cnt1[j];
137+
for (int j = 0; j < i; ++j) t += cnt2[j];
138+
ans = min(ans, t);
139+
}
140+
};
141+
f(cnt1, cnt2);
142+
f(cnt2, cnt1);
143+
return ans;
144+
}
145+
};
146+
```
147+
148+
### **Go**
149+
150+
```go
151+
func minCharacters(a string, b string) int {
152+
cnt1 := [26]int{}
153+
cnt2 := [26]int{}
154+
for _, c := range a {
155+
cnt1[c-'a']++
156+
}
157+
for _, c := range b {
158+
cnt2[c-'a']++
159+
}
160+
m, n := len(a), len(b)
161+
ans := m + n
162+
for i := 0; i < 26; i++ {
163+
ans = min(ans, m+n-cnt1[i]-cnt2[i])
164+
}
165+
f := func(cnt1, cnt2 [26]int) {
166+
for i := 1; i < 26; i++ {
167+
t := 0
168+
for j := i; j < 26; j++ {
169+
t += cnt1[j]
170+
}
171+
for j := 0; j < i; j++ {
172+
t += cnt2[j]
173+
}
174+
ans = min(ans, t)
175+
}
176+
}
177+
f(cnt1, cnt2)
178+
f(cnt2, cnt1)
179+
return ans
180+
}
181+
182+
func min(a, b int) int {
183+
if a < b {
184+
return a
185+
}
186+
return b
187+
}
64188
```
65189

66190
### **TypeScript**
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int minCharacters(string a, string b) {
4+
int m = a.size(), n = b.size();
5+
vector<int> cnt1(26);
6+
vector<int> cnt2(26);
7+
for (char& c : a) ++cnt1[c - 'a'];
8+
for (char& c : b) ++cnt2[c - 'a'];
9+
int ans = m + n;
10+
for (int i = 0; i < 26; ++i) ans = min(ans, m + n - cnt1[i] - cnt2[i]);
11+
auto f = [&](vector<int>& cnt1, vector<int>& cnt2) {
12+
for (int i = 1; i < 26; ++i) {
13+
int t = 0;
14+
for (int j = i; j < 26; ++j) t += cnt1[j];
15+
for (int j = 0; j < i; ++j) t += cnt2[j];
16+
ans = min(ans, t);
17+
}
18+
};
19+
f(cnt1, cnt2);
20+
f(cnt2, cnt1);
21+
return ans;
22+
}
23+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
func minCharacters(a string, b string) int {
2+
cnt1 := [26]int{}
3+
cnt2 := [26]int{}
4+
for _, c := range a {
5+
cnt1[c-'a']++
6+
}
7+
for _, c := range b {
8+
cnt2[c-'a']++
9+
}
10+
m, n := len(a), len(b)
11+
ans := m + n
12+
for i := 0; i < 26; i++ {
13+
ans = min(ans, m+n-cnt1[i]-cnt2[i])
14+
}
15+
f := func(cnt1, cnt2 [26]int) {
16+
for i := 1; i < 26; i++ {
17+
t := 0
18+
for j := i; j < 26; j++ {
19+
t += cnt1[j]
20+
}
21+
for j := 0; j < i; j++ {
22+
t += cnt2[j]
23+
}
24+
ans = min(ans, t)
25+
}
26+
}
27+
f(cnt1, cnt2)
28+
f(cnt2, cnt1)
29+
return ans
30+
}
31+
32+
func min(a, b int) int {
33+
if a < b {
34+
return a
35+
}
36+
return b
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
private int ans;
3+
4+
public int minCharacters(String a, String b) {
5+
int m = a.length(), n = b.length();
6+
int[] cnt1 = new int[26];
7+
int[] cnt2 = new int[26];
8+
for (int i = 0; i < m; ++i) {
9+
++cnt1[a.charAt(i) - 'a'];
10+
}
11+
for (int i = 0; i < n; ++i) {
12+
++cnt2[b.charAt(i) - 'a'];
13+
}
14+
ans = m + n;
15+
for (int i = 0; i < 26; ++i) {
16+
ans = Math.min(ans, m + n - cnt1[i] - cnt2[i]);
17+
}
18+
f(cnt1, cnt2);
19+
f(cnt2, cnt1);
20+
return ans;
21+
}
22+
23+
private void f(int[] cnt1, int[] cnt2) {
24+
for (int i = 1; i < 26; ++i) {
25+
int t = 0;
26+
for (int j = i; j < 26; ++j) {
27+
t += cnt1[j];
28+
}
29+
for (int j = 0; j < i; ++j) {
30+
t += cnt2[j];
31+
}
32+
ans = Math.min(ans, t);
33+
}
34+
}
35+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /