0
点赞
收藏
分享

微信扫一扫

LeetCode 1745. 回文串分割 IV

截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
LeetCode 1745. 回文串分割 IV_动态规划
LeetCode 1745. 回文串分割 IV_leetcode_02

ublic boolean checkPartitioning(String s) {
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j < s.length() - 1; j++) {
//截取字符串[0,i]
String str1 = s.substring(0, i + 1);
//截取字符串[i+1,j]
String str2 = s.substring(i + 1, j + 1);
//截取字符串[j+1,s.length()-1]
String str3 = s.substring(j + 1, s.length());
//把字符串s截取3段,判断每段是否都是回文的
if (isPalindrome(str1) && isPalindrome(str2) && isPalindrome(str3))
return true;
}
}
return false;

如果字符串s比较短的话,上面代码是没有问题的,但如果字符串s比较长,很容易超时。

我们可以先计算字符串s的所有子串中哪些是回文的,哪些不是,然后再判断。关于计算方式在​​《540,动态规划和中心扩散法解回文子串》​​中有详细介绍,除此之外还可有看下

​​553,动态规划解分割回文串 II​​

​​551,回溯算法解分割回文串​​

​​517,最长回文子串的3种解决方式​​

这里就不在重复介绍。我们来直接看下代码

public boolean checkPartitioning(String s) {
int length = s.length();
//dp[i][j]:表示字符串s从下标i到j是否是回文串
boolean[][] dp = new boolean[length][length];
for (int i = length - 1; i >= 0; i--) {
for (int j = i; j < length; j++) {
//如果i和j指向的字符不一样,那么dp[i][j]就
//不能构成回文字符串
if (s.charAt(i) != s.charAt(j))
continue;
dp[i][j] = j - i <= 2 || dp[i + 1][j - 1];
}
}

//然后再截取3段,判断这3段是否都是回文的
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length - 1; j++) {
if (dp[0][i] && dp[i + 1][j] && dp[j + 1][length - 1])
return true;
}
}
return false;
}


举报

相关推荐

0 条评论