Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d35d2d9

Browse files
authored
feat: add solutions to lc problem: No.2911 (doocs#1874)
No.2911.Minimum Changes to Make K Semi-palindromes
1 parent a2eda11 commit d35d2d9

File tree

8 files changed

+582
-7
lines changed

8 files changed

+582
-7
lines changed

solution/2600-2699/2698.Find the Punishment Number of an Integer/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060

6161
枚举结束,返回答案即可。
6262

63-
时间复杂度 $O(n \times \log^2 n)$,空间复杂度 $O(\log n)$。其中 $n$ 为给定的正整数。
63+
时间复杂度 $O(n^{1 + 2 \log_{10}^2})$,空间复杂度 $O(\log n)$。其中 $n$ 为给定的正整数。
6464

6565
<!-- tabs:start -->
6666

solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README.md

Lines changed: 195 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,219 @@
6666
<!-- 这里可写当前语言的特殊实现逻辑 -->
6767

6868
```python
69-
69+
class Solution:
70+
def minimumChanges(self, s: str, k: int) -> int:
71+
n = len(s)
72+
g = [[inf] * (n + 1) for _ in range(n + 1)]
73+
for i in range(1, n + 1):
74+
for j in range(i, n + 1):
75+
m = j - i + 1
76+
for d in range(1, m):
77+
if m % d == 0:
78+
cnt = 0
79+
for l in range(m):
80+
r = (m // d - 1 - l // d) * d + l % d
81+
if l >= r:
82+
break
83+
if s[i - 1 + l] != s[i - 1 + r]:
84+
cnt += 1
85+
g[i][j] = min(g[i][j], cnt)
86+
87+
f = [[inf] * (k + 1) for _ in range(n + 1)]
88+
f[0][0] = 0
89+
for i in range(1, n + 1):
90+
for j in range(1, k + 1):
91+
for h in range(i - 1):
92+
f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i])
93+
return f[n][k]
7094
```
7195

7296
### **Java**
7397

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

76100
```java
77-
101+
class Solution {
102+
public int minimumChanges(String s, int k) {
103+
int n = s.length();
104+
int[][] g = new int[n + 1][n + 1];
105+
int[][] f = new int[n + 1][k + 1];
106+
final int inf = 1 << 30;
107+
for (int i = 0; i <= n; ++i) {
108+
Arrays.fill(g[i], inf);
109+
Arrays.fill(f[i], inf);
110+
}
111+
for (int i = 1; i <= n; ++i) {
112+
for (int j = i; j <= n; ++j) {
113+
int m = j - i + 1;
114+
for (int d = 1; d < m; ++d) {
115+
if (m % d == 0) {
116+
int cnt = 0;
117+
for (int l = 0; l < m; ++l) {
118+
int r = (m / d - 1 - l / d) * d + l % d;
119+
if (l >= r) {
120+
break;
121+
}
122+
if (s.charAt(i - 1 + l) != s.charAt(i - 1 + r)) {
123+
++cnt;
124+
}
125+
}
126+
g[i][j] = Math.min(g[i][j], cnt);
127+
}
128+
}
129+
}
130+
}
131+
f[0][0] = 0;
132+
for (int i = 1; i <= n; ++i) {
133+
for (int j = 1; j <= k; ++j) {
134+
for (int h = 0; h < i - 1; ++h) {
135+
f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]);
136+
}
137+
}
138+
}
139+
return f[n][k];
140+
}
141+
}
78142
```
79143

80144
### **C++**
81145

82146
```cpp
83-
147+
class Solution {
148+
public:
149+
int minimumChanges(string s, int k) {
150+
int n = s.size();
151+
int g[n + 1][n + 1];
152+
int f[n + 1][k + 1];
153+
memset(g, 0x3f, sizeof(g));
154+
memset(f, 0x3f, sizeof(f));
155+
f[0][0] = 0;
156+
for (int i = 1; i <= n; ++i) {
157+
for (int j = i; j <= n; ++j) {
158+
int m = j - i + 1;
159+
for (int d = 1; d < m; ++d) {
160+
if (m % d == 0) {
161+
int cnt = 0;
162+
for (int l = 0; l < m; ++l) {
163+
int r = (m / d - 1 - l / d) * d + l % d;
164+
if (l >= r) {
165+
break;
166+
}
167+
if (s[i - 1 + l] != s[i - 1 + r]) {
168+
++cnt;
169+
}
170+
}
171+
g[i][j] = min(g[i][j], cnt);
172+
}
173+
}
174+
}
175+
}
176+
for (int i = 1; i <= n; ++i) {
177+
for (int j = 1; j <= k; ++j) {
178+
for (int h = 0; h < i - 1; ++h) {
179+
f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]);
180+
}
181+
}
182+
}
183+
return f[n][k];
184+
}
185+
};
84186
```
85187
86188
### **Go**
87189
88190
```go
191+
func minimumChanges(s string, k int) int {
192+
n := len(s)
193+
g := make([][]int, n+1)
194+
f := make([][]int, n+1)
195+
const inf int = 1 << 30
196+
for i := range g {
197+
g[i] = make([]int, n+1)
198+
f[i] = make([]int, k+1)
199+
for j := range g[i] {
200+
g[i][j] = inf
201+
}
202+
for j := range f[i] {
203+
f[i][j] = inf
204+
}
205+
}
206+
f[0][0] = 0
207+
for i := 1; i <= n; i++ {
208+
for j := i; j <= n; j++ {
209+
m := j - i + 1
210+
for d := 1; d < m; d++ {
211+
if m%d == 0 {
212+
cnt := 0
213+
for l := 0; l < m; l++ {
214+
r := (m/d-1-l/d)*d + l%d
215+
if l >= r {
216+
break
217+
}
218+
if s[i-1+l] != s[i-1+r] {
219+
cnt++
220+
}
221+
}
222+
g[i][j] = min(g[i][j], cnt)
223+
}
224+
}
225+
}
226+
}
227+
for i := 1; i <= n; i++ {
228+
for j := 1; j <= k; j++ {
229+
for h := 0; h < i-1; h++ {
230+
f[i][j] = min(f[i][j], f[h][j-1]+g[h+1][i])
231+
}
232+
}
233+
}
234+
return f[n][k]
235+
}
236+
237+
func min(a, b int) int {
238+
if a < b {
239+
return a
240+
}
241+
return b
242+
}
243+
```
89244

245+
### **TypeScript**
246+
247+
```ts
248+
function minimumChanges(s: string, k: number): number {
249+
const n = s.length;
250+
const g = Array.from({ length: n + 1 }, () => Array.from({ length: n + 1 }, () => Infinity));
251+
const f = Array.from({ length: n + 1 }, () => Array.from({ length: k + 1 }, () => Infinity));
252+
f[0][0] = 0;
253+
for (let i = 1; i <= n; ++i) {
254+
for (let j = 1; j <= n; ++j) {
255+
const m = j - i + 1;
256+
for (let d = 1; d < m; ++d) {
257+
if (m % d === 0) {
258+
let cnt = 0;
259+
for (let l = 0; l < m; ++l) {
260+
const r = (((m / d) | 0) - 1 - ((l / d) | 0)) * d + (l % d);
261+
if (l >= r) {
262+
break;
263+
}
264+
if (s[i - 1 + l] !== s[i - 1 + r]) {
265+
++cnt;
266+
}
267+
}
268+
g[i][j] = Math.min(g[i][j], cnt);
269+
}
270+
}
271+
}
272+
}
273+
for (let i = 1; i <= n; ++i) {
274+
for (let j = 1; j <= k; ++j) {
275+
for (let h = 0; h < i - 1; ++h) {
276+
f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]);
277+
}
278+
}
279+
}
280+
return f[n][k];
281+
}
90282
```
91283

92284
### **...**

0 commit comments

Comments
 (0)