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

Sign up
Appearance settings

Commit 57e2c78

Browse files
committed
feat: add solutions to lc/lcof2 problems
lc No.0131, lcof2 No.086: Palindrome Partitioning
1 parent 8b3d0d1 commit 57e2c78

File tree

11 files changed

+676
-35
lines changed

11 files changed

+676
-35
lines changed

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

Lines changed: 143 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343

4444
<p><meta charset="UTF-8" />注意:本题与主站 131&nbsp;题相同:&nbsp;<a href="https://leetcode-cn.com/problems/palindrome-partitioning/">https://leetcode-cn.com/problems/palindrome-partitioning/</a></p>
4545

46-
4746
## 解法
4847

4948
<!-- 这里可写通用的实现逻辑 -->
@@ -55,15 +54,157 @@
5554
<!-- 这里可写当前语言的特殊实现逻辑 -->
5655

5756
```python
58-
57+
class Solution:
58+
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
68+
if i == n:
69+
ans.append(t.copy())
70+
return
71+
for j in range(i, n):
72+
if dp[i][j]:
73+
t.append(s[i: j + 1])
74+
dfs(s, j + 1, t)
75+
t.pop(-1)
76+
77+
dfs(s, 0, [])
78+
return ans
5979
```
6080

6181
### **Java**
6282

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

6585
```java
86+
class Solution {
87+
private boolean[][] dp;
88+
private List<List<String>> ans;
89+
private int n;
90+
91+
public String[][] partition(String s) {
92+
ans = new ArrayList<>();
93+
n = s.length();
94+
dp = new boolean[n][n];
95+
for (int i = 0; i < n; ++i) {
96+
Arrays.fill(dp[i], true);
97+
}
98+
for (int i = n - 1; i >= 0; --i) {
99+
for (int j = i + 1; j < n; ++j) {
100+
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
101+
}
102+
}
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;
109+
}
110+
111+
private void dfs(String s, int i, List<String> t) {
112+
if (i == n) {
113+
ans.add(new ArrayList<>(t));
114+
return;
115+
}
116+
for (int j = i; j < n; ++j) {
117+
if (dp[i][j]) {
118+
t.add(s.substring(i, j + 1));
119+
dfs(s, j + 1, t);
120+
t.remove(t.size() - 1);
121+
}
122+
}
123+
}
124+
}
125+
```
126+
127+
### **C++**
128+
129+
```cpp
130+
class Solution {
131+
public:
132+
vector<vector<bool>> dp;
133+
vector<vector<string>> ans;
134+
int n;
135+
136+
vector<vector<string>> partition(string s) {
137+
n = s.size();
138+
dp.assign(n, vector<bool>(n, true));
139+
for (int i = n - 1; i >= 0; --i)
140+
{
141+
for (int j = i + 1; j < n; ++j)
142+
{
143+
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
144+
}
145+
}
146+
vector<string> t;
147+
dfs(s, 0, t);
148+
return ans;
149+
}
150+
151+
void dfs(string& s, int i, vector<string> t) {
152+
if (i == n)
153+
{
154+
ans.push_back(t);
155+
return;
156+
}
157+
for (int j = i; j < n; ++j)
158+
{
159+
if (dp[i][j])
160+
{
161+
t.push_back(s.substr(i, j - i + 1));
162+
dfs(s, j + 1, t);
163+
t.pop_back();
164+
}
165+
}
166+
}
167+
};
168+
```
66169
170+
### **Go**
171+
172+
```go
173+
func partition(s string) [][]string {
174+
n := len(s)
175+
dp := make([][]bool, n)
176+
var ans [][]string
177+
for i := 0; i < n; i++ {
178+
dp[i] = make([]bool, n)
179+
for j := 0; j < n; j++ {
180+
dp[i][j] = true
181+
}
182+
}
183+
for i := n - 1; i >= 0; i-- {
184+
for j := i + 1; j < n; j++ {
185+
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
186+
}
187+
}
188+
189+
var dfs func(s string, i int, t []string)
190+
dfs = func(s string, i int, t []string) {
191+
if i == n {
192+
ans = append(ans, append([]string(nil), t...))
193+
return
194+
}
195+
for j := i; j < n; j++ {
196+
if dp[i][j] {
197+
t = append(t, s[i:j+1])
198+
dfs(s, j+1, t)
199+
t = t[:len(t)-1]
200+
}
201+
}
202+
}
203+
204+
var t []string
205+
dfs(s, 0, t)
206+
return ans
207+
}
67208
```
68209

69210
### **...**
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
{
12+
for (int j = i + 1; j < n; ++j)
13+
{
14+
dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1];
15+
}
16+
}
17+
vector<string> t;
18+
dfs(s, 0, t);
19+
return ans;
20+
}
21+
22+
void dfs(string& s, int i, vector<string> t) {
23+
if (i == n)
24+
{
25+
ans.push_back(t);
26+
return;
27+
}
28+
for (int j = i; j < n; ++j)
29+
{
30+
if (dp[i][j])
31+
{
32+
t.push_back(s.substr(i, j - i + 1));
33+
dfs(s, j + 1, t);
34+
t.pop_back();
35+
}
36+
}
37+
}
38+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
func partition(s string) [][]string {
2+
n := len(s)
3+
dp := make([][]bool, n)
4+
var ans [][]string
5+
for i := 0; i < n; i++ {
6+
dp[i] = make([]bool, n)
7+
for j := 0; j < n; j++ {
8+
dp[i][j] = true
9+
}
10+
}
11+
for i := n - 1; i >= 0; i-- {
12+
for j := i + 1; j < n; j++ {
13+
dp[i][j] = s[i] == s[j] && dp[i+1][j-1]
14+
}
15+
}
16+
17+
var dfs func(s string, i int, t []string)
18+
dfs = func(s string, i int, t []string) {
19+
if i == n {
20+
ans = append(ans, append([]string(nil), t...))
21+
return
22+
}
23+
for j := i; j < n; j++ {
24+
if dp[i][j] {
25+
t = append(t, s[i:j+1])
26+
dfs(s, j+1, t)
27+
t = t[:len(t)-1]
28+
}
29+
}
30+
}
31+
32+
var t []string
33+
dfs(s, 0, t)
34+
return ans
35+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
private boolean[][] dp;
3+
private List<List<String>> ans;
4+
private int n;
5+
6+
public String[][] partition(String s) {
7+
ans = new ArrayList<>();
8+
n = s.length();
9+
dp = new boolean[n][n];
10+
for (int i = 0; i < n; ++i) {
11+
Arrays.fill(dp[i], true);
12+
}
13+
for (int i = n - 1; i >= 0; --i) {
14+
for (int j = i + 1; j < n; ++j) {
15+
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
16+
}
17+
}
18+
dfs(s, 0, new ArrayList<>());
19+
String [][] res = new String [ans.size()][];
20+
for (int i = 0; i < ans.size(); ++i) {
21+
res[i] = ans.get(i).toArray(new String[0]);
22+
}
23+
return res;
24+
}
25+
26+
private void dfs(String s, int i, List<String> t) {
27+
if (i == n) {
28+
ans.add(new ArrayList<>(t));
29+
return;
30+
}
31+
for (int j = i; j < n; ++j) {
32+
if (dp[i][j]) {
33+
t.add(s.substring(i, j + 1));
34+
dfs(s, j + 1, t);
35+
t.remove(t.size() - 1);
36+
}
37+
}
38+
}
39+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
def partition(self, s: str) -> List[List[str]]:
3+
ans = []
4+
n = len(s)
5+
dp = [[True] * n for _ in range(n)]
6+
for i in range(n - 1, -1, -1):
7+
for j in range(i + 1, n):
8+
dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1]
9+
10+
def dfs(s, i, t):
11+
nonlocal n
12+
if i == n:
13+
ans.append(t.copy())
14+
return
15+
for j in range(i, n):
16+
if dp[i][j]:
17+
t.append(s[i: j + 1])
18+
dfs(s, j + 1, t)
19+
t.pop(-1)
20+
21+
dfs(s, 0, [])
22+
return ans

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /