Skip to content

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

+136-2
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

+125-1
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**
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+
};
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+
}
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)