647.回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
来源:LeetCode
网址:https://leetcode-cn.com/problems/palindromic-substrings/
动态规划
dp[i][j]=x,表示在区间i,j的子串,是否为回文
public int countSubstrings(String s) {
if(s == null || s.length() == 0) return 0;
//dp[i][j]=x
int n = s.length();
boolean[][] dp = new boolean[n+1][n+1];
//base case
int cnt = 0;
for(int i = 0;i < n;i++) {
dp[i][i] = true;
cnt++;
}
//state convert
for(int i = n-2;i >= 0;i--){
for(int j = i+1;j < n;j++){
if(s.charAt(i) == s.charAt(j)){
if(j == i+1)
dp[i][j] = true;
else
dp[i][j] = dp[i+1][j-1];
if (dp[i][j] == true)
cnt++;
}else{
dp[i][j] = false;
}
}
}
return cnt;
}
中心扩散
奇数以一个字母向两边扩散
偶数以相邻两个字母向两边扩散
int cnt;
public int countSubstrings(String s) {
if(s == null) return 0;
cnt = 0;
for (int i = 0;i < s.length();i++){
count(s,i,i);//奇数
count(s,i,i+1);//偶数
}
return cnt;
}
private void count(String s,int left,int right){
while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
cnt++;
left--;
right++;
}
}