-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSolution_132.java
More file actions
68 lines (62 loc) · 1.88 KB
/
Solution_132.java
File metadata and controls
68 lines (62 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
132. 分割回文串 II
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
*/
public class Solution {
public static void main(String[] args) {
String s = "aaba";
Solution solution = new Solution();
System.out.println(solution.minCut(s));
}
boolean[][] isPalindrome;
public int minCut(String s) {
if ( s == null || s.length() == 0 || s.length() == 1 )
return 0;
int l = s.length();
isPalindrome = isPali(s);
int[] dp = new int[l];
for ( int i = 0 ; i < l ; i++ )
dp[i] = i;
for ( int i = 0 ; i < l ; i++ ) {
for ( int j = i ; j < l ; j++ ) {
if ( isPalindrome[i][j] ) {
if ( i == 0 )
dp[j] = 0;
else
dp[j] = Math.min(dp[i - 1] + 1, dp[j]);
}
}
}
return dp[l-1];
}
private boolean[][] isPali (String s) {
int l = s.length();
boolean[][] isPali = new boolean[l][l];
for ( int i = 0 ; i < l ; i++)
for ( int j = 0 ; j < l ; j++)
isPali[i][j] = false;
char[] chars = s.toCharArray();
for ( int mid = 0 ; mid < l ; mid++ ) {
int i = mid;
int j = mid;
while ( i >= 0 && j < l && chars[i] == chars[j] ) {
isPali[i][j] = true;
i--;
j++;
}
i = mid;
j = mid+1;
while ( i >= 0 && j < l && chars[i] == chars[j] ) {
isPali[i][j] = true;
i--;
j++;
}
}
return isPali;
}
}