diff --git a/solution/2600-2699/2698.Find the Punishment Number of an Integer/README.md b/solution/2600-2699/2698.Find the Punishment Number of an Integer/README.md index a15066eb6bff1..0a1310751196e 100644 --- a/solution/2600-2699/2698.Find the Punishment Number of an Integer/README.md +++ b/solution/2600-2699/2698.Find the Punishment Number of an Integer/README.md @@ -60,7 +60,7 @@ 枚举结束,返回答案即可。 -时间复杂度 $O(n \times \log^2 n)$,空间复杂度 $O(\log n)$。其中 $n$ 为给定的正整数。 +时间复杂度 $O(n^{1 + 2 \log_{10}^2})$,空间复杂度 $O(\log n)$。其中 $n$ 为给定的正整数。 diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README.md b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README.md index 95a4c68062ce6..a793cdbb9235a 100644 --- a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README.md +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README.md @@ -66,7 +66,31 @@ ```python - +class Solution: + def minimumChanges(self, s: str, k: int) -> int: + n = len(s) + g = [[inf] * (n + 1) for _ in range(n + 1)] + for i in range(1, n + 1): + for j in range(i, n + 1): + m = j - i + 1 + for d in range(1, m): + if m % d == 0: + cnt = 0 + for l in range(m): + r = (m // d - 1 - l // d) * d + l % d + if l >= r: + break + if s[i - 1 + l] != s[i - 1 + r]: + cnt += 1 + g[i][j] = min(g[i][j], cnt) + + f = [[inf] * (k + 1) for _ in range(n + 1)] + f[0][0] = 0 + for i in range(1, n + 1): + for j in range(1, k + 1): + for h in range(i - 1): + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]) + return f[n][k] ``` ### **Java** @@ -74,19 +98,187 @@ ```java - +class Solution { + public int minimumChanges(String s, int k) { + int n = s.length(); + int[][] g = new int[n + 1][n + 1]; + int[][] f = new int[n + 1][k + 1]; + final int inf = 1 << 30; + for (int i = 0; i <= n; ++i) { + Arrays.fill(g[i], inf); + Arrays.fill(f[i], inf); + } + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s.charAt(i - 1 + l) != s.charAt(i - 1 + r)) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +} ``` ### **C++** ```cpp - +class Solution { +public: + int minimumChanges(string s, int k) { + int n = s.size(); + int g[n + 1][n + 1]; + int f[n + 1][k + 1]; + memset(g, 0x3f, sizeof(g)); + memset(f, 0x3f, sizeof(f)); + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s[i - 1 + l] != s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = min(g[i][j], cnt); + } + } + } + } + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +}; ``` ### **Go** ```go +func minimumChanges(s string, k int) int { + n := len(s) + g := make([][]int, n+1) + f := make([][]int, n+1) + const inf int = 1 << 30 + for i := range g { + g[i] = make([]int, n+1) + f[i] = make([]int, k+1) + for j := range g[i] { + g[i][j] = inf + } + for j := range f[i] { + f[i][j] = inf + } + } + f[0][0] = 0 + for i := 1; i <= n; i++ { + for j := i; j <= n; j++ { + m := j - i + 1 + for d := 1; d < m; d++ { + if m%d == 0 { + cnt := 0 + for l := 0; l < m; l++ { + r := (m/d-1-l/d)*d + l%d + if l >= r { + break + } + if s[i-1+l] != s[i-1+r] { + cnt++ + } + } + g[i][j] = min(g[i][j], cnt) + } + } + } + } + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + for h := 0; h < i-1; h++ { + f[i][j] = min(f[i][j], f[h][j-1]+g[h+1][i]) + } + } + } + return f[n][k] +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} +``` +### **TypeScript** + +```ts +function minimumChanges(s: string, k: number): number { + const n = s.length; + const g = Array.from({ length: n + 1 }, () => Array.from({ length: n + 1 }, () => Infinity)); + const f = Array.from({ length: n + 1 }, () => Array.from({ length: k + 1 }, () => Infinity)); + f[0][0] = 0; + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= n; ++j) { + const m = j - i + 1; + for (let d = 1; d < m; ++d) { + if (m % d === 0) { + let cnt = 0; + for (let l = 0; l < m; ++l) { + const r = (((m / d) | 0) - 1 - ((l / d) | 0)) * d + (l % d); + if (l >= r) { + break; + } + if (s[i - 1 + l] !== s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= k; ++j) { + for (let h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; +} ``` ### **...** diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README_EN.md b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README_EN.md index c5f37e541cec8..da2a15919629f 100644 --- a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README_EN.md +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/README_EN.md @@ -58,25 +58,217 @@ The strings "aa" and "bb" are already semi-palindromes. Thus ### **Python3** ```python - +class Solution: + def minimumChanges(self, s: str, k: int) -> int: + n = len(s) + g = [[inf] * (n + 1) for _ in range(n + 1)] + for i in range(1, n + 1): + for j in range(i, n + 1): + m = j - i + 1 + for d in range(1, m): + if m % d == 0: + cnt = 0 + for l in range(m): + r = (m // d - 1 - l // d) * d + l % d + if l >= r: + break + if s[i - 1 + l] != s[i - 1 + r]: + cnt += 1 + g[i][j] = min(g[i][j], cnt) + + f = [[inf] * (k + 1) for _ in range(n + 1)] + f[0][0] = 0 + for i in range(1, n + 1): + for j in range(1, k + 1): + for h in range(i - 1): + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]) + return f[n][k] ``` ### **Java** ```java - +class Solution { + public int minimumChanges(String s, int k) { + int n = s.length(); + int[][] g = new int[n + 1][n + 1]; + int[][] f = new int[n + 1][k + 1]; + final int inf = 1 << 30; + for (int i = 0; i <= n; ++i) { + Arrays.fill(g[i], inf); + Arrays.fill(f[i], inf); + } + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s.charAt(i - 1 + l) != s.charAt(i - 1 + r)) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +} ``` ### **C++** ```cpp - +class Solution { +public: + int minimumChanges(string s, int k) { + int n = s.size(); + int g[n + 1][n + 1]; + int f[n + 1][k + 1]; + memset(g, 0x3f, sizeof(g)); + memset(f, 0x3f, sizeof(f)); + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s[i - 1 + l] != s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = min(g[i][j], cnt); + } + } + } + } + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +}; ``` ### **Go** ```go +func minimumChanges(s string, k int) int { + n := len(s) + g := make([][]int, n+1) + f := make([][]int, n+1) + const inf int = 1 << 30 + for i := range g { + g[i] = make([]int, n+1) + f[i] = make([]int, k+1) + for j := range g[i] { + g[i][j] = inf + } + for j := range f[i] { + f[i][j] = inf + } + } + f[0][0] = 0 + for i := 1; i <= n; i++ { + for j := i; j <= n; j++ { + m := j - i + 1 + for d := 1; d < m; d++ { + if m%d == 0 { + cnt := 0 + for l := 0; l < m; l++ { + r := (m/d-1-l/d)*d + l%d + if l >= r { + break + } + if s[i-1+l] != s[i-1+r] { + cnt++ + } + } + g[i][j] = min(g[i][j], cnt) + } + } + } + } + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + for h := 0; h < i-1; h++ { + f[i][j] = min(f[i][j], f[h][j-1]+g[h+1][i]) + } + } + } + return f[n][k] +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} +``` +### **TypeScript** + +```ts +function minimumChanges(s: string, k: number): number { + const n = s.length; + const g = Array.from({ length: n + 1 }, () => Array.from({ length: n + 1 }, () => Infinity)); + const f = Array.from({ length: n + 1 }, () => Array.from({ length: k + 1 }, () => Infinity)); + f[0][0] = 0; + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= n; ++j) { + const m = j - i + 1; + for (let d = 1; d < m; ++d) { + if (m % d === 0) { + let cnt = 0; + for (let l = 0; l < m; ++l) { + const r = (((m / d) | 0) - 1 - ((l / d) | 0)) * d + (l % d); + if (l >= r) { + break; + } + if (s[i - 1 + l] !== s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= k; ++j) { + for (let h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; +} ``` ### **...** diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.cpp b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.cpp new file mode 100644 index 0000000000000..25f8a695f3ff4 --- /dev/null +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.cpp @@ -0,0 +1,39 @@ +class Solution { +public: + int minimumChanges(string s, int k) { + int n = s.size(); + int g[n + 1][n + 1]; + int f[n + 1][k + 1]; + memset(g, 0x3f, sizeof(g)); + memset(f, 0x3f, sizeof(f)); + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s[i - 1 + l] != s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = min(g[i][j], cnt); + } + } + } + } + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +}; \ No newline at end of file diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.go b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.go new file mode 100644 index 0000000000000..937692505b0ac --- /dev/null +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.go @@ -0,0 +1,52 @@ +func minimumChanges(s string, k int) int { + n := len(s) + g := make([][]int, n+1) + f := make([][]int, n+1) + const inf int = 1 << 30 + for i := range g { + g[i] = make([]int, n+1) + f[i] = make([]int, k+1) + for j := range g[i] { + g[i][j] = inf + } + for j := range f[i] { + f[i][j] = inf + } + } + f[0][0] = 0 + for i := 1; i <= n; i++ { + for j := i; j <= n; j++ { + m := j - i + 1 + for d := 1; d < m; d++ { + if m%d == 0 { + cnt := 0 + for l := 0; l < m; l++ { + r := (m/d-1-l/d)*d + l%d + if l >= r { + break + } + if s[i-1+l] != s[i-1+r] { + cnt++ + } + } + g[i][j] = min(g[i][j], cnt) + } + } + } + } + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + for h := 0; h < i-1; h++ { + f[i][j] = min(f[i][j], f[h][j-1]+g[h+1][i]) + } + } + } + return f[n][k] +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} \ No newline at end of file diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.java b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.java new file mode 100644 index 0000000000000..ca035d3009c14 --- /dev/null +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.java @@ -0,0 +1,41 @@ +class Solution { + public int minimumChanges(String s, int k) { + int n = s.length(); + int[][] g = new int[n + 1][n + 1]; + int[][] f = new int[n + 1][k + 1]; + final int inf = 1 << 30; + for (int i = 0; i <= n; ++i) { + Arrays.fill(g[i], inf); + Arrays.fill(f[i], inf); + } + for (int i = 1; i <= n; ++i) { + for (int j = i; j <= n; ++j) { + int m = j - i + 1; + for (int d = 1; d < m; ++d) { + if (m % d == 0) { + int cnt = 0; + for (int l = 0; l < m; ++l) { + int r = (m / d - 1 - l / d) * d + l % d; + if (l >= r) { + break; + } + if (s.charAt(i - 1 + l) != s.charAt(i - 1 + r)) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + f[0][0] = 0; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + for (int h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; + } +} \ No newline at end of file diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.py b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.py new file mode 100644 index 0000000000000..90678b55a5e5e --- /dev/null +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.py @@ -0,0 +1,25 @@ +class Solution: + def minimumChanges(self, s: str, k: int) -> int: + n = len(s) + g = [[inf] * (n + 1) for _ in range(n + 1)] + for i in range(1, n + 1): + for j in range(i, n + 1): + m = j - i + 1 + for d in range(1, m): + if m % d == 0: + cnt = 0 + for l in range(m): + r = (m // d - 1 - l // d) * d + l % d + if l >= r: + break + if s[i - 1 + l] != s[i - 1 + r]: + cnt += 1 + g[i][j] = min(g[i][j], cnt) + + f = [[inf] * (k + 1) for _ in range(n + 1)] + f[0][0] = 0 + for i in range(1, n + 1): + for j in range(1, k + 1): + for h in range(i - 1): + f[i][j] = min(f[i][j], f[h][j - 1] + g[h + 1][i]) + return f[n][k] diff --git a/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.ts b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.ts new file mode 100644 index 0000000000000..22fcf4759e1cc --- /dev/null +++ b/solution/2900-2999/2911.Minimum Changes to Make K Semi-palindromes/Solution.ts @@ -0,0 +1,34 @@ +function minimumChanges(s: string, k: number): number { + const n = s.length; + const g = Array.from({ length: n + 1 }, () => Array.from({ length: n + 1 }, () => Infinity)); + const f = Array.from({ length: n + 1 }, () => Array.from({ length: k + 1 }, () => Infinity)); + f[0][0] = 0; + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= n; ++j) { + const m = j - i + 1; + for (let d = 1; d < m; ++d) { + if (m % d === 0) { + let cnt = 0; + for (let l = 0; l < m; ++l) { + const r = (((m / d) | 0) - 1 - ((l / d) | 0)) * d + (l % d); + if (l >= r) { + break; + } + if (s[i - 1 + l] !== s[i - 1 + r]) { + ++cnt; + } + } + g[i][j] = Math.min(g[i][j], cnt); + } + } + } + } + for (let i = 1; i <= n; ++i) { + for (let j = 1; j <= k; ++j) { + for (let h = 0; h < i - 1; ++h) { + f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h + 1][i]); + } + } + } + return f[n][k]; +}