To split the string into three non-empty palindromic substrings, we can try all possible pairs of split points and check if all three resulting substrings are palindromes. Precomputing all palindromic substrings with DP allows fast checking.
classSolution {
publicbooleancheckPartitioning(String s) {
int n = s.length();
boolean[][] isPal =newboolean[n][n];
for (int i = n-1; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (s.charAt(i) == s.charAt(j) && (j-i < 2 || isPal[i+1][j-1]))
isPal[i][j]=true;
}
}
for (int i = 1; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (isPal[0][i-1]&& isPal[i][j-1]&& isPal[j][n-1])
returntrue;
}
}
returnfalse;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funcheckPartitioning(s: String): Boolean {
val n = s.length
val isPal = Array(n) { BooleanArray(n) }
for (i in n-1 downTo 0) {
for (j in i until n) {
if (s[i] == s[j] && (j-i < 2|| isPal[i+1][j-1]))
isPal[i][j] = true }
}
for (i in1 until n-1) {
for (j in i+1 until n) {
if (isPal[0][i-1] && isPal[i][j-1] && isPal[j][n-1])
returntrue }
}
returnfalse }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defcheckPartitioning(self, s: str) -> bool:
n = len(s)
is_pal = [[False]*n for _ in range(n)]
for i in range(n-1, -1, -1):
for j in range(i, n):
if s[i] == s[j] and (j-i <2or is_pal[i+1][j-1]):
is_pal[i][j] =Truefor i in range(1, n-1):
for j in range(i+1, n):
if is_pal[0][i-1] and is_pal[i][j-1] and is_pal[j][n-1]:
returnTruereturnFalse
impl Solution {
pubfncheck_partitioning(s: String) -> bool {
let n = s.len();
let s = s.as_bytes();
letmut is_pal =vec![vec![false; n]; n];
for i in (0..n).rev() {
for j in i..n {
if s[i] == s[j] && (j-i <2|| is_pal[i+1][j-1]) {
is_pal[i][j] =true;
}
}
}
for i in1..n-1 {
for j in i+1..n {
if is_pal[0][i-1] && is_pal[i][j-1] && is_pal[j][n-1] {
returntrue;
}
}
}
false }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
checkPartitioning(s: string):boolean {
constn=s.length;
constisPal: boolean[][] = Array.from({length: n}, () => Array(n).fill(false));
for (leti=n-1; i>=0; i--) {
for (letj=i; j<n; j++) {
if (s[i] ===s[j] && (j-i<2||isPal[i+1][j-1]))
isPal[i][j] =true;
}
}
for (leti=1; i<n-1; i++) {
for (letj=i+1; j<n; j++) {
if (isPal[0][i-1] &&isPal[i][j-1] &&isPal[j][n-1])
returntrue;
}
}
returnfalse;
}
}