LeetCode刷题记149
132. 分割回文串 II
class Solution {
public boolean isPalindrome(int i, int j, String s) {
while(i < j) {
if (s.charAt(i) != s.charAt(j)) return false;
i ++;
j --;
}
return true;
}
public int minCut(String s) {
int[] dp = new int[s.length() + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i <= s.length(); i ++) {
for (int j = s.length(); j >= i; j --) {
if (isPalindrome(i - 1, j - 1, s)) {
dp[j] = Math.min(dp[j], dp[i - 1] + 1);
}
}
}
return dp[s.length()] - 1;
}
}
啊这,就通过了。。我都惊呆了,没有仔细想,就是效率太低了。
class Solution {
public boolean isPalindrome(int i, int j, String s, int[][] p) {
if (p[i][j] == 1) return true;
if (p[i][j] == -1) return false;
if (i == j) {
p[i][j] = 1;
return true;
}
int k1 = (i + j - 1) / 2;
int k2 = k1 + (i + j + 1) % 2 + 1;
while (k1 >= i && k2 <= j) {
if (s.charAt(k1) != s.charAt(k2)) {
p[k1][k2] = -1;
return false;
}
p[k1 --][k2 ++] = 1;
}
return true;
}
public int minCut(String s) {
int[][] p = new int[s.length()][s.length()];
int[] dp = new int[s.length() + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i <= s.length(); i ++) {
for (int j = s.length(); j >= i; j --) {
if (isPalindrome(i - 1, j - 1, s, p)) {
dp[j] = Math.min(dp[j], dp[i - 1] + 1);
}
}
}
return dp[s.length()] - 1;
}
}
改了一下,快了一点。
6/3
149/150