🎈LeetCode647.回文子串
链接:647.回文子串
给你一个字符串
s
,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
public int countSubstrings(String s) {
char[] chars = s.toCharArray();
int len = chars.length;
boolean[][] dp = new boolean[len][len];
int result = 0;
for (int i = len - 1; i >= 0; i--) {
for (int j = i; j < len; j++) {
if (chars[i] == chars[j]) {
if (j - i <= 1) { // 情况一 和 情况二
result++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1]) { //情况三
result++;
dp[i][j] = true;
}
}
}
}
return result;
}
🎈LeetCode516.最长回文子序列
链接:516.最长回文子序列
给你一个字符串
s
,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
public int longestPalindromeSubseq(String s) {
// dp[i][j]表示下标为i到j的最长回文子序列的长度
int[][] dp=new int[s.length()][s.length()];
// 递推公式
// if(s.charAt(i)==s.charAt(j)){
// dp[i][j]=dp[i+1][j-1]+2;
// }else{
// dp[i][j]=Math.max(dp[i][j-1],dp[i+1][j]);
// }
// 初始化
for(int i=0;i<s.length();i++){
dp[i][i]=1;
}
// 遍历
for(int i=s.length()-1;i>=0;i--){
for(int j=i+1;j<s.length();j++){
if(s.charAt(i)==s.charAt(j)){
dp[i][j]=dp[i+1][j-1]+2;
}else{
dp[i][j]=Math.max(dp[i][j-1],dp[i+1][j]);
}
}
}
return dp[0][s.length()-1];
}