leetcode 思路——647. 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:
输入: “abc”
输出: 3
解释: 三个回文子串: “a”, “b”, “c”.
示例 2:
输入: “aaa”
输出: 6
说明: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
注意:
输入的字符串长度不会超过1000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindromic-substrings
动态规划思路:
- 我们先给dp进行下定义,由于我们需要双指针两端动态寻找回文串,所以dp为二维数组方式,我们定义
dp[i][j]
为字符串从i到j整个是否是回文串。 - 然后状态变换为右指针向右移动的同时,左指针从0开始遍历到右指针,判断内部是否为回文串;
- 最后确定状态方程,首先
dp[i][j]
是回文串的前提条件是str[i] == str[j],而且左右指针分别向内移动一个也是回文串,要考虑到一种特殊情况就是两个字符相连的情况。
代码:
class Solution {
public:
int countSubstrings(string s) {
int _size = s.size();
if(_size<1) return 0;
int dp[_size][_size];
for(int i = 0;i<_size;i++){
dp[i][i] = 1;
}
int count = 0;
for(int r = 1;r<_size;r++){
for(int l = 0;l<r;l++){
if(s[r] == s[l] && (r-l ==1 || dp[l+1][r-1])){
dp[l][r] = 1;
count++;
}else{
dp[l][r] = false;
}
}
}
return count+_size;
}
};