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

Appearance settings

Commit b1a5496

Browse filesBrowse files
authored
feat: add solutions to lcof2 problem: No.086 (doocs#1438)
No.086.分割回文子字符串
1 parent 291ffeb commit b1a5496
Copy full SHA for b1a5496

File tree

Expand file treeCollapse file tree

10 files changed

+347
-209
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

10 files changed

+347
-209
lines changed
Open diff view settings
Collapse file

‎lcof2/剑指 Offer II 086. 分割回文子字符串/README.md‎

Copy file name to clipboardExpand all lines: lcof2/剑指 Offer II 086. 分割回文子字符串/README.md
+149-69Lines changed: 149 additions & 69 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
**方法一:预处理 + DFS(回溯)**
51+
52+
我们可以使用动态规划,预处理出字符串中的任意子串是否为回文串,即 $f[i][j]$ 表示子串 $s[i..j]$ 是否为回文串。
53+
54+
接下来,我们设计一个函数 $dfs(i)$,表示从字符串的第 $i$ 个字符开始,分割成若干回文串,当前分割方案为 $t$。
55+
56+
如果 $i=|s|$,说明已经分割完成,我们将 $t$ 放入答案数组中,然后返回。
57+
58+
否则,我们可以从 $i$ 开始,从小到大依次枚举结束位置 $j$,如果 $s[i..j]$ 是回文串,那么就把 $s[i..j]$ 加入到 $t$ 中,然后继续递归 $dfs(j+1)$,回溯的时候要弹出 $s[i..j]$。
59+
60+
时间复杂度 $O(n \times 2^n)$,空间复杂度 $O(n^2)$。其中 $n$ 是字符串的长度。
61+
5062
<!-- tabs:start -->
5163

5264
### **Python3**
@@ -56,25 +68,24 @@
5668
```python
5769
class Solution:
5870
def partition(self, s: str) -> List[List[str]]:
59-
ans = []
60-
n = len(s)
61-
dp = [[True] * n for _ in range(n)]
62-
for i in range(n - 1, -1, -1):
63-
for j in range(i + 1, n):
64-
dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]
65-
66-
def dfs(s, i, t):
67-
nonlocal n
71+
def dfs(i: int):
6872
if i == n:
69-
ans.append(t.copy())
73+
ans.append(t[:])
7074
return
7175
for j in range(i, n):
72-
if dp[i][j]:
76+
if f[i][j]:
7377
t.append(s[i : j + 1])
74-
dfs(s, j + 1, t)
75-
t.pop(-1)
78+
dfs(j + 1)
79+
t.pop()
7680

77-
dfs(s, 0, [])
81+
n = len(s)
82+
f = [[True] * n for _ in range(n)]
83+
for i in range(n - 1, -1, -1):
84+
for j in range(i + 1, n):
85+
f[i][j] = s[i] == s[j] and f[i + 1][j - 1]
86+
ans = []
87+
t = []
88+
dfs(0)
7889
return ans
7990
```
8091

@@ -84,39 +95,37 @@ class Solution:
8495

8596
```java
8697
class Solution {
87-
private boolean[][] dp;
88-
private List<List<String>> ans;
8998
private int n;
99+
private String s;
100+
private boolean[][] f;
101+
private List<String> t = new ArrayList<>();
102+
private List<List<String>> ans = new ArrayList<>();
90103

91-
public String[][] partition(String s) {
92-
ans = new ArrayList<>();
104+
public List<List<String>> partition(String s) {
93105
n = s.length();
94-
dp = new boolean[n][n];
106+
f = new boolean[n][n];
95107
for (int i = 0; i < n; ++i) {
96-
Arrays.fill(dp[i], true);
108+
Arrays.fill(f[i], true);
97109
}
98110
for (int i = n - 1; i >= 0; --i) {
99111
for (int j = i + 1; j < n; ++j) {
100-
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
112+
f[i][j] = s.charAt(i) == s.charAt(j) && f[i + 1][j - 1];
101113
}
102114
}
103-
dfs(s, 0, new ArrayList<>());
104-
String[][] res = new String[ans.size()][];
105-
for (int i = 0; i < ans.size(); ++i) {
106-
res[i] = ans.get(i).toArray(new String[0]);
107-
}
108-
return res;
115+
this.s = s;
116+
dfs(0);
117+
return ans;
109118
}
110119

111-
private void dfs(String s, int i, List<String> t) {
112-
if (i == n) {
120+
private void dfs(int i) {
121+
if (i == s.length()) {
113122
ans.add(new ArrayList<>(t));
114123
return;
115124
}
116125
for (int j = i; j < n; ++j) {
117-
if (dp[i][j]) {
126+
if (f[i][j]) {
118127
t.add(s.substring(i, j + 1));
119-
dfs(s, j + 1, t);
128+
dfs(j + 1);
120129
t.remove(t.size() - 1);
121130
}
122131
}
@@ -129,76 +138,147 @@ class Solution {
129138
```cpp
130139
class Solution {
131140
public:
132-
vector<vector<bool>> dp;
133-
vector<vector<string>> ans;
134-
int n;
135-
136141
vector<vector<string>> partition(string s) {
137-
n = s.size();
138-
dp.assign(n, vector<bool>(n, true));
142+
int n = s.size();
143+
bool f[n][n];
144+
memset(f, true, sizeof(f));
139145
for (int i = n - 1; i >= 0; --i) {
140146
for (int j = i + 1; j < n; ++j) {
141-
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
147+
f[i][j] = s[i] == s[j] && f[i + 1][j - 1];
142148
}
143149
}
150+
vector<vector<string>> ans;
144151
vector<string> t;
145-
dfs(s, 0, t);
146-
return ans;
147-
}
148-
149-
void dfs(string& s, int i, vector<string> t) {
150-
if (i == n) {
151-
ans.push_back(t);
152-
return;
153-
}
154-
for (int j = i; j < n; ++j) {
155-
if (dp[i][j]) {
156-
t.push_back(s.substr(i, j - i + 1));
157-
dfs(s, j + 1, t);
158-
t.pop_back();
152+
function<void(int)> dfs = [&](int i) {
153+
if (i == n) {
154+
ans.push_back(t);
155+
return;
159156
}
160-
}
157+
for (int j = i; j < n; ++j) {
158+
if (f[i][j]) {
159+
t.push_back(s.substr(i, j - i + 1));
160+
dfs(j + 1);
161+
t.pop_back();
162+
}
163+
}
164+
};
165+
dfs(0);
166+
return ans;
161167
}
162168
};
163169
```
164170
165171
### **Go**
166172
167173
```go
168-
func partition(s string) [][]string {
174+
func partition(s string) (ans [][]string) {
169175
n := len(s)
170-
dp := make([][]bool, n)
171-
var ans [][]string
172-
for i := 0; i < n; i++ {
173-
dp[i] = make([]bool, n)
174-
for j := 0; j < n; j++ {
175-
dp[i][j] = true
176+
f := make([][]bool, n)
177+
for i := range f {
178+
f[i] = make([]bool, n)
179+
for j := range f[i] {
180+
f[i][j] = true
176181
}
177182
}
178183
for i := n - 1; i >= 0; i-- {
179184
for j := i + 1; j < n; j++ {
180-
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
185+
f[i][j] = s[i] == s[j] && f[i+1][j-1]
181186
}
182187
}
183-
184-
var dfs func(s string, i int, t []string)
185-
dfs = func(s string, i int, t []string) {
188+
t := []string{}
189+
var dfs func(int)
190+
dfs = func(i int) {
186191
if i == n {
187192
ans = append(ans, append([]string(nil), t...))
188193
return
189194
}
190195
for j := i; j < n; j++ {
191-
if dp[i][j] {
196+
if f[i][j] {
192197
t = append(t, s[i:j+1])
193-
dfs(s, j+1, t)
198+
dfs(j + 1)
194199
t = t[:len(t)-1]
195200
}
196201
}
197202
}
203+
dfs(0)
204+
return
205+
}
206+
```
207+
208+
### **TypeScript**
209+
210+
```ts
211+
function partition(s: string): string[][] {
212+
const n = s.length;
213+
const f: boolean[][] = new Array(n)
214+
.fill(0)
215+
.map(() => new Array(n).fill(true));
216+
for (let i = n - 1; i >= 0; --i) {
217+
for (let j = i + 1; j < n; ++j) {
218+
f[i][j] = s[i] === s[j] && f[i + 1][j - 1];
219+
}
220+
}
221+
const ans: string[][] = [];
222+
const t: string[] = [];
223+
const dfs = (i: number) => {
224+
if (i === n) {
225+
ans.push(t.slice());
226+
return;
227+
}
228+
for (let j = i; j < n; ++j) {
229+
if (f[i][j]) {
230+
t.push(s.slice(i, j + 1));
231+
dfs(j + 1);
232+
t.pop();
233+
}
234+
}
235+
};
236+
dfs(0);
237+
return ans;
238+
}
239+
```
240+
241+
### **C#**
242+
243+
```cs
244+
public class Solution {
245+
private int n;
246+
private string s;
247+
private bool[,] f;
248+
private IList<IList<string>> ans = new List<IList<string>>();
249+
private IList<string> t = new List<string>();
250+
251+
public IList<IList<string>> Partition(string s) {
252+
n = s.Length;
253+
this.s = s;
254+
f = new bool[n, n];
255+
for (int i = 0; i < n; ++i) {
256+
for (int j = 0; j <= i; ++j) {
257+
f[i, j] = true;
258+
}
259+
}
260+
for (int i = n - 1; i >= 0; --i) {
261+
for (int j = i + 1; j < n; ++j) {
262+
f[i, j] = s[i] == s[j] && f[i + 1, j - 1];
263+
}
264+
}
265+
dfs(0);
266+
return ans;
267+
}
198268

199-
var t []string
200-
dfs(s, 0, t)
201-
return ans
269+
private void dfs(int i) {
270+
if (i == n) {
271+
ans.Add(new List<string>(t));
272+
return;
273+
}
274+
for (int j = i; j < n; ++j) {
275+
if (f[i, j]) {
276+
t.Add(s.Substring(i, j + 1 - i));
277+
dfs(j + 1);
278+
t.RemoveAt(t.Count - 1);
279+
}
280+
}
281+
}
202282
}
203283
```
204284

Collapse file
+29-32Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
1-
class Solution {
2-
public:
3-
vector<vector<bool>> dp;
4-
vector<vector<string>> ans;
5-
int n;
6-
7-
vector<vector<string>> partition(string s) {
8-
n = s.size();
9-
dp.assign(n, vector<bool>(n, true));
10-
for (int i = n - 1; i >= 0; --i) {
11-
for (int j = i + 1; j < n; ++j) {
12-
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
13-
}
14-
}
15-
vector<string> t;
16-
dfs(s, 0, t);
17-
return ans;
18-
}
19-
20-
void dfs(string& s, int i, vector<string> t) {
21-
if (i == n) {
22-
ans.push_back(t);
23-
return;
24-
}
25-
for (int j = i; j < n; ++j) {
26-
if (dp[i][j]) {
27-
t.push_back(s.substr(i, j - i + 1));
28-
dfs(s, j + 1, t);
29-
t.pop_back();
30-
}
31-
}
32-
}
1+
class Solution {
2+
public:
3+
vector<vector<string>> partition(string s) {
4+
int n = s.size();
5+
bool f[n][n];
6+
memset(f, true, sizeof(f));
7+
for (int i = n - 1; i >= 0; --i) {
8+
for (int j = i + 1; j < n; ++j) {
9+
f[i][j] = s[i] == s[j] && f[i + 1][j - 1];
10+
}
11+
}
12+
vector<vector<string>> ans;
13+
vector<string> t;
14+
function<void(int)> dfs = [&](int i) {
15+
if (i == n) {
16+
ans.push_back(t);
17+
return;
18+
}
19+
for (int j = i; j < n; ++j) {
20+
if (f[i][j]) {
21+
t.push_back(s.substr(i, j - i + 1));
22+
dfs(j + 1);
23+
t.pop_back();
24+
}
25+
}
26+
};
27+
dfs(0);
28+
return ans;
29+
}
3330
};

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.