Skip to content

Commit 20a8332

Browse files
committed
feat: add solutions to lc problem: No.0131
No.0131.Palindrome Partitioning
1 parent e2e0178 commit 20a8332

File tree

8 files changed

+392
-263
lines changed

8 files changed

+392
-263
lines changed

solution/0100-0199/0131.Palindrome Partitioning/README.md

+143-63
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@
3939

4040
<!-- 这里可写通用的实现逻辑 -->
4141

42+
**方法一:预处理 + DFS(回溯)**
43+
44+
我们可以使用动态规划,预处理出字符串中的任意子串是否为回文串,即 $f[i][j]$ 表示子串 $s[i..j]$ 是否为回文串。
45+
46+
接下来,我们设计一个函数 $dfs(i)$,表示从字符串的第 $i$ 个字符开始,分割成若干回文串,当前分割方案为 $t$。我们可以从 $i$ 开始,从小到大依次枚举结束位置 $j$,如果 $s[i..j]$ 是回文串,那么就把 $s[i..j]$ 加入到 $t$ 中,然后继续递归 $dfs(j+1)$,回溯的时候要弹出 $s[i..j]$。
47+
48+
时间复杂度 $O(n \times 2^n)$,空间复杂度 $O(n^2)$。其中 $n$ 是字符串的长度。
49+
4250
<!-- tabs:start -->
4351

4452
### **Python3**
@@ -48,25 +56,24 @@
4856
```python
4957
class Solution:
5058
def partition(self, s: str) -> List[List[str]]:
51-
ans = []
52-
n = len(s)
53-
dp = [[True] * n for _ in range(n)]
54-
for i in range(n - 1, -1, -1):
55-
for j in range(i + 1, n):
56-
dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]
57-
58-
def dfs(s, i, t):
59-
nonlocal n
59+
def dfs(i: int):
6060
if i == n:
61-
ans.append(t.copy())
61+
ans.append(t[:])
6262
return
6363
for j in range(i, n):
64-
if dp[i][j]:
64+
if f[i][j]:
6565
t.append(s[i : j + 1])
66-
dfs(s, j + 1, t)
67-
t.pop(-1)
66+
dfs(j + 1)
67+
t.pop()
6868

69-
dfs(s, 0, [])
69+
n = len(s)
70+
f = [[True] * n for _ in range(n)]
71+
for i in range(n - 1, -1, -1):
72+
for j in range(i + 1, n):
73+
f[i][j] = s[i] == s[j] and f[i + 1][j - 1]
74+
ans = []
75+
t = []
76+
dfs(0)
7077
return ans
7178
```
7279

@@ -76,35 +83,37 @@ class Solution:
7683

7784
```java
7885
class Solution {
79-
private boolean[][] dp;
80-
private List<List<String>> ans;
8186
private int n;
87+
private String s;
88+
private boolean[][] f;
89+
private List<String> t = new ArrayList<>();
90+
private List<List<String>> ans = new ArrayList<>();
8291

8392
public List<List<String>> partition(String s) {
84-
ans = new ArrayList<>();
8593
n = s.length();
86-
dp = new boolean[n][n];
94+
f = new boolean[n][n];
8795
for (int i = 0; i < n; ++i) {
88-
Arrays.fill(dp[i], true);
96+
Arrays.fill(f[i], true);
8997
}
9098
for (int i = n - 1; i >= 0; --i) {
9199
for (int j = i + 1; j < n; ++j) {
92-
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
100+
f[i][j] = s.charAt(i) == s.charAt(j) && f[i + 1][j - 1];
93101
}
94102
}
95-
dfs(s, 0, new ArrayList<>());
103+
this.s = s;
104+
dfs(0);
96105
return ans;
97106
}
98107

99-
private void dfs(String s, int i, List<String> t) {
100-
if (i == n) {
108+
private void dfs(int i) {
109+
if (i == s.length()) {
101110
ans.add(new ArrayList<>(t));
102111
return;
103112
}
104113
for (int j = i; j < n; ++j) {
105-
if (dp[i][j]) {
114+
if (f[i][j]) {
106115
t.add(s.substring(i, j + 1));
107-
dfs(s, j + 1, t);
116+
dfs(j + 1);
108117
t.remove(t.size() - 1);
109118
}
110119
}
@@ -117,76 +126,147 @@ class Solution {
117126
```cpp
118127
class Solution {
119128
public:
120-
vector<vector<bool>> dp;
121-
vector<vector<string>> ans;
122-
int n;
123-
124129
vector<vector<string>> partition(string s) {
125-
n = s.size();
126-
dp.assign(n, vector<bool>(n, true));
130+
int n = s.size();
131+
bool f[n][n];
132+
memset(f, true, sizeof(f));
127133
for (int i = n - 1; i >= 0; --i) {
128134
for (int j = i + 1; j < n; ++j) {
129-
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
135+
f[i][j] = s[i] == s[j] && f[i + 1][j - 1];
130136
}
131137
}
138+
vector<vector<string>> ans;
132139
vector<string> t;
133-
dfs(s, 0, t);
134-
return ans;
135-
}
136-
137-
void dfs(string& s, int i, vector<string> t) {
138-
if (i == n) {
139-
ans.push_back(t);
140-
return;
141-
}
142-
for (int j = i; j < n; ++j) {
143-
if (dp[i][j]) {
144-
t.push_back(s.substr(i, j - i + 1));
145-
dfs(s, j + 1, t);
146-
t.pop_back();
140+
function<void(int)> dfs = [&](int i) -> void {
141+
if (i == n) {
142+
ans.push_back(t);
143+
return;
147144
}
148-
}
145+
for (int j = i; j < n; ++j) {
146+
if (f[i][j]) {
147+
t.push_back(s.substr(i, j - i + 1));
148+
dfs(j + 1);
149+
t.pop_back();
150+
}
151+
}
152+
};
153+
dfs(0);
154+
return ans;
149155
}
150156
};
151157
```
152158
153159
### **Go**
154160
155161
```go
156-
func partition(s string) [][]string {
162+
func partition(s string) (ans [][]string) {
157163
n := len(s)
158-
dp := make([][]bool, n)
159-
var ans [][]string
160-
for i := 0; i < n; i++ {
161-
dp[i] = make([]bool, n)
162-
for j := 0; j < n; j++ {
163-
dp[i][j] = true
164+
f := make([][]bool, n)
165+
for i := range f {
166+
f[i] = make([]bool, n)
167+
for j := range f[i] {
168+
f[i][j] = true
164169
}
165170
}
166171
for i := n - 1; i >= 0; i-- {
167172
for j := i + 1; j < n; j++ {
168-
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
173+
f[i][j] = s[i] == s[j] && f[i+1][j-1]
169174
}
170175
}
171-
172-
var dfs func(s string, i int, t []string)
173-
dfs = func(s string, i int, t []string) {
176+
t := []string{}
177+
var dfs func(int)
178+
dfs = func(i int) {
174179
if i == n {
175180
ans = append(ans, append([]string(nil), t...))
176181
return
177182
}
178183
for j := i; j < n; j++ {
179-
if dp[i][j] {
184+
if f[i][j] {
180185
t = append(t, s[i:j+1])
181-
dfs(s, j+1, t)
186+
dfs(j + 1)
182187
t = t[:len(t)-1]
183188
}
184189
}
185190
}
191+
dfs(0)
192+
return
193+
}
194+
```
186195

187-
var t []string
188-
dfs(s, 0, t)
189-
return ans
196+
### **TypeScript**
197+
198+
```ts
199+
function partition(s: string): string[][] {
200+
const n = s.length;
201+
const f: boolean[][] = new Array(n)
202+
.fill(0)
203+
.map(() => new Array(n).fill(true));
204+
for (let i = n - 1; i >= 0; --i) {
205+
for (let j = i + 1; j < n; ++j) {
206+
f[i][j] = s[i] === s[j] && f[i + 1][j - 1];
207+
}
208+
}
209+
const ans: string[][] = [];
210+
const t: string[] = [];
211+
const dfs = (i: number) => {
212+
if (i === n) {
213+
ans.push(t.slice());
214+
return;
215+
}
216+
for (let j = i; j < n; ++j) {
217+
if (f[i][j]) {
218+
t.push(s.slice(i, j + 1));
219+
dfs(j + 1);
220+
t.pop();
221+
}
222+
}
223+
};
224+
dfs(0);
225+
return ans;
226+
}
227+
```
228+
229+
### **C#**
230+
231+
```cs
232+
public class Solution {
233+
private int n;
234+
private string s;
235+
private bool[,] f;
236+
private IList<IList<string>> ans = new List<IList<string>>();
237+
private IList<string> t = new List<string>();
238+
239+
public IList<IList<string>> Partition(string s) {
240+
n = s.Length;
241+
this.s = s;
242+
f = new bool[n, n];
243+
for (int i = 0; i < n; ++i) {
244+
for (int j = 0; j <= i; ++j) {
245+
f[i, j] = true;
246+
}
247+
}
248+
for (int i = n - 1; i >= 0; --i) {
249+
for (int j = i + 1; j < n; ++j) {
250+
f[i, j] = s[i] == s[j] && f[i + 1, j - 1];
251+
}
252+
}
253+
dfs(0);
254+
return ans;
255+
}
256+
257+
private void dfs(int i) {
258+
if (i == n) {
259+
ans.Add(new List<string>(t));
260+
return;
261+
}
262+
for (int j = i; j < n; ++j) {
263+
if (f[i, j]) {
264+
t.Add(s.Substring(i, j + 1 - i));
265+
dfs(j + 1);
266+
t.RemoveAt(t.Count - 1);
267+
}
268+
}
269+
}
190270
}
191271
```
192272

0 commit comments

Comments
 (0)