39
39
40
40
<!-- 这里可写通用的实现逻辑 -->
41
41
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
+
42
50
<!-- tabs:start -->
43
51
44
52
### ** Python3**
48
56
``` python
49
57
class Solution :
50
58
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 ):
60
60
if i == n:
61
- ans.append(t.copy() )
61
+ ans.append(t[:] )
62
62
return
63
63
for j in range (i, n):
64
- if dp [i][j]:
64
+ if f [i][j]:
65
65
t.append(s[i : j + 1 ])
66
- dfs(s, j + 1 , t )
67
- t.pop(- 1 )
66
+ dfs(j + 1 )
67
+ t.pop()
68
68
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 )
70
77
return ans
71
78
```
72
79
@@ -76,35 +83,37 @@ class Solution:
76
83
77
84
``` java
78
85
class Solution {
79
- private boolean [][] dp;
80
- private List<List<String > > ans;
81
86
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<> ();
82
91
83
92
public List<List<String > > partition (String s ) {
84
- ans = new ArrayList<> ();
85
93
n = s. length();
86
- dp = new boolean [n][n];
94
+ f = new boolean [n][n];
87
95
for (int i = 0 ; i < n; ++ i) {
88
- Arrays . fill(dp [i], true );
96
+ Arrays . fill(f [i], true );
89
97
}
90
98
for (int i = n - 1 ; i >= 0 ; -- i) {
91
99
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 ];
93
101
}
94
102
}
95
- dfs(s, 0 , new ArrayList<> ());
103
+ this . s = s;
104
+ dfs(0 );
96
105
return ans;
97
106
}
98
107
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() ) {
101
110
ans. add(new ArrayList<> (t));
102
111
return ;
103
112
}
104
113
for (int j = i; j < n; ++ j) {
105
- if (dp [i][j]) {
114
+ if (f [i][j]) {
106
115
t. add(s. substring(i, j + 1 ));
107
- dfs(s, j + 1 , t );
116
+ dfs(j + 1 );
108
117
t. remove(t. size() - 1 );
109
118
}
110
119
}
@@ -117,76 +126,147 @@ class Solution {
117
126
``` cpp
118
127
class Solution {
119
128
public:
120
- vector<vector<bool >> dp;
121
- vector<vector<string >> ans;
122
- int n;
123
-
124
129
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));
127
133
for (int i = n - 1; i >= 0; --i) {
128
134
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 ] ;
130
136
}
131
137
}
138
+ vector<vector<string >> ans;
132
139
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;
147
144
}
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;
149
155
}
150
156
};
151
157
```
152
158
153
159
### **Go**
154
160
155
161
```go
156
- func partition(s string) [][]string {
162
+ func partition(s string) (ans [][]string) {
157
163
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
164
169
}
165
170
}
166
171
for i := n - 1; i >= 0; i-- {
167
172
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]
169
174
}
170
175
}
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) {
174
179
if i == n {
175
180
ans = append(ans, append([]string(nil), t...))
176
181
return
177
182
}
178
183
for j := i; j < n; j++ {
179
- if dp [i][j] {
184
+ if f [i][j] {
180
185
t = append(t, s[i:j+1])
181
- dfs(s, j+1, t )
186
+ dfs(j + 1 )
182
187
t = t[:len(t)-1]
183
188
}
184
189
}
185
190
}
191
+ dfs(0)
192
+ return
193
+ }
194
+ ```
186
195
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
+ }
190
270
}
191
271
```
192
272
0 commit comments