Skip to content

Commit 576783a

Browse files
committed
feat: add solutions to lc problem: No.1745
No.1745.Palindrome Partitioning IV
1 parent b25082d commit 576783a

File tree

6 files changed

+255
-2
lines changed

6 files changed

+255
-2
lines changed

solution/1700-1799/1745.Palindrome Partitioning IV/README.md

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,113 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:预处理 + 枚举**
45+
46+
预处理出字符串 `s` 的所有子串是否为回文串,然后枚举 `s` 的所有分割点,判断是否满足条件。
47+
48+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 为字符串 `s` 的长度。
49+
4450
<!-- tabs:start -->
4551

4652
### **Python3**
4753

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

5056
```python
51-
57+
class Solution:
58+
def checkPartitioning(self, s: str) -> bool:
59+
n = len(s)
60+
g = [[True] * n for _ in range(n)]
61+
for i in range(n - 1, -1, -1):
62+
for j in range(i + 1, n):
63+
g[i][j] = s[i] == s[j] and (i + 1 == j or g[i + 1][j - 1])
64+
for i in range(n - 2):
65+
for j in range(i + 1, n - 1):
66+
if g[0][i] and g[i + 1][j] and g[j + 1][-1]:
67+
return True
68+
return False
5269
```
5370

5471
### **Java**
5572

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

5875
```java
76+
class Solution {
77+
public boolean checkPartitioning(String s) {
78+
int n = s.length();
79+
boolean[][] g = new boolean[n][n];
80+
for (var e : g) {
81+
Arrays.fill(e, true);
82+
}
83+
for (int i = n - 1; i >= 0; --i) {
84+
for (int j = i + 1; j < n; ++j) {
85+
g[i][j] = s.charAt(i) == s.charAt(j) && (i + 1 == j || g[i + 1][j - 1]);
86+
}
87+
}
88+
for (int i = 0; i < n - 2; ++i) {
89+
for (int j = i + 1; j < n - 1; ++j) {
90+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
91+
return true;
92+
}
93+
}
94+
}
95+
return false;
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
bool checkPartitioning(string s) {
106+
int n = s.size();
107+
vector<vector<bool>> g(n, vector<bool>(n, true));
108+
for (int i = n - 1; i >= 0; --i) {
109+
for (int j = i + 1; j < n; ++j) {
110+
g[i][j] = s[i] == s[j] && (i + 1 == j || g[i + 1][j - 1]);
111+
}
112+
}
113+
for (int i = 0; i < n - 2; ++i) {
114+
for (int j = i + 1; j < n - 1; ++j) {
115+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
116+
return true;
117+
}
118+
}
119+
}
120+
return false;
121+
}
122+
};
123+
```
59124
125+
### **Go**
126+
127+
```go
128+
func checkPartitioning(s string) bool {
129+
n := len(s)
130+
g := make([][]bool, n)
131+
for i := range g {
132+
g[i] = make([]bool, n)
133+
for j := range g[i] {
134+
g[i][j] = true
135+
}
136+
}
137+
for i := n - 1; i >= 0; i-- {
138+
for j := i + 1; j < n; j++ {
139+
g[i][j] = s[i] == s[j] && (i+1 == j || g[i+1][j-1])
140+
}
141+
}
142+
for i := 0; i < n-2; i++ {
143+
for j := i + 1; j < n-1; j++ {
144+
if g[0][i] && g[i+1][j] && g[j+1][n-1] {
145+
return true
146+
}
147+
}
148+
}
149+
return false
150+
}
60151
```
61152

62153
### **...**

solution/1700-1799/1745.Palindrome Partitioning IV/README_EN.md

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,98 @@
4040
### **Python3**
4141

4242
```python
43-
43+
class Solution:
44+
def checkPartitioning(self, s: str) -> bool:
45+
n = len(s)
46+
g = [[True] * n for _ in range(n)]
47+
for i in range(n - 1, -1, -1):
48+
for j in range(i + 1, n):
49+
g[i][j] = s[i] == s[j] and (i + 1 == j or g[i + 1][j - 1])
50+
for i in range(n - 2):
51+
for j in range(i + 1, n - 1):
52+
if g[0][i] and g[i + 1][j] and g[j + 1][-1]:
53+
return True
54+
return False
4455
```
4556

4657
### **Java**
4758

4859
```java
60+
class Solution {
61+
public boolean checkPartitioning(String s) {
62+
int n = s.length();
63+
boolean[][] g = new boolean[n][n];
64+
for (var e : g) {
65+
Arrays.fill(e, true);
66+
}
67+
for (int i = n - 1; i >= 0; --i) {
68+
for (int j = i + 1; j < n; ++j) {
69+
g[i][j] = s.charAt(i) == s.charAt(j) && (i + 1 == j || g[i + 1][j - 1]);
70+
}
71+
}
72+
for (int i = 0; i < n - 2; ++i) {
73+
for (int j = i + 1; j < n - 1; ++j) {
74+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
75+
return true;
76+
}
77+
}
78+
}
79+
return false;
80+
}
81+
}
82+
```
83+
84+
### **C++**
85+
86+
```cpp
87+
class Solution {
88+
public:
89+
bool checkPartitioning(string s) {
90+
int n = s.size();
91+
vector<vector<bool>> g(n, vector<bool>(n, true));
92+
for (int i = n - 1; i >= 0; --i) {
93+
for (int j = i + 1; j < n; ++j) {
94+
g[i][j] = s[i] == s[j] && (i + 1 == j || g[i + 1][j - 1]);
95+
}
96+
}
97+
for (int i = 0; i < n - 2; ++i) {
98+
for (int j = i + 1; j < n - 1; ++j) {
99+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
100+
return true;
101+
}
102+
}
103+
}
104+
return false;
105+
}
106+
};
107+
```
49108
109+
### **Go**
110+
111+
```go
112+
func checkPartitioning(s string) bool {
113+
n := len(s)
114+
g := make([][]bool, n)
115+
for i := range g {
116+
g[i] = make([]bool, n)
117+
for j := range g[i] {
118+
g[i][j] = true
119+
}
120+
}
121+
for i := n - 1; i >= 0; i-- {
122+
for j := i + 1; j < n; j++ {
123+
g[i][j] = s[i] == s[j] && (i+1 == j || g[i+1][j-1])
124+
}
125+
}
126+
for i := 0; i < n-2; i++ {
127+
for j := i + 1; j < n-1; j++ {
128+
if g[0][i] && g[i+1][j] && g[j+1][n-1] {
129+
return true
130+
}
131+
}
132+
}
133+
return false
134+
}
50135
```
51136

52137
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
bool checkPartitioning(string s) {
4+
int n = s.size();
5+
vector<vector<bool>> g(n, vector<bool>(n, true));
6+
for (int i = n - 1; i >= 0; --i) {
7+
for (int j = i + 1; j < n; ++j) {
8+
g[i][j] = s[i] == s[j] && (i + 1 == j || g[i + 1][j - 1]);
9+
}
10+
}
11+
for (int i = 0; i < n - 2; ++i) {
12+
for (int j = i + 1; j < n - 1; ++j) {
13+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
14+
return true;
15+
}
16+
}
17+
}
18+
return false;
19+
}
20+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func checkPartitioning(s string) bool {
2+
n := len(s)
3+
g := make([][]bool, n)
4+
for i := range g {
5+
g[i] = make([]bool, n)
6+
for j := range g[i] {
7+
g[i][j] = true
8+
}
9+
}
10+
for i := n - 1; i >= 0; i-- {
11+
for j := i + 1; j < n; j++ {
12+
g[i][j] = s[i] == s[j] && (i+1 == j || g[i+1][j-1])
13+
}
14+
}
15+
for i := 0; i < n-2; i++ {
16+
for j := i + 1; j < n-1; j++ {
17+
if g[0][i] && g[i+1][j] && g[j+1][n-1] {
18+
return true
19+
}
20+
}
21+
}
22+
return false
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public boolean checkPartitioning(String s) {
3+
int n = s.length();
4+
boolean[][] g = new boolean[n][n];
5+
for (var e : g) {
6+
Arrays.fill(e, true);
7+
}
8+
for (int i = n - 1; i >= 0; --i) {
9+
for (int j = i + 1; j < n; ++j) {
10+
g[i][j] = s.charAt(i) == s.charAt(j) && (i + 1 == j || g[i + 1][j - 1]);
11+
}
12+
}
13+
for (int i = 0; i < n - 2; ++i) {
14+
for (int j = i + 1; j < n - 1; ++j) {
15+
if (g[0][i] && g[i + 1][j] && g[j + 1][n - 1]) {
16+
return true;
17+
}
18+
}
19+
}
20+
return false;
21+
}
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def checkPartitioning(self, s: str) -> bool:
3+
n = len(s)
4+
g = [[True] * n for _ in range(n)]
5+
for i in range(n - 1, -1, -1):
6+
for j in range(i + 1, n):
7+
g[i][j] = s[i] == s[j] and (i + 1 == j or g[i + 1][j - 1])
8+
for i in range(n - 2):
9+
for j in range(i + 1, n - 1):
10+
if g[0][i] and g[i + 1][j] and g[j + 1][-1]:
11+
return True
12+
return False

0 commit comments

Comments
 (0)