题目
中文
英文
题解
第一次
dp[i][j]代表字符串s在[i][j]区间子串是否是一个回文串。
状态转移方程:当 s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1]) 时,dp[i][j]=true,否则为false
即
- 当只有一个字符,自然是回文串
- 当有两个字符如果相等则也是回文串
- 当有三个及以上字符时,比如 ababa 这个字符记作串 1,把两边的 a 去掉,也就是 bab 记作串 2,可以看出只要串2是一个回文串,那么左右各多了一个 a 的串 1 必定也是回文串。所以当 s[i]==s[j] 时,自然要看 dp[i+1][j-1] 是不是一个回文串。
class Solution {public:int countSubstrings(string s) {int n = s.size();int ans = 0;//从 i 开始的长度为 len 的子串是否是回文子串vector<vector<bool>>dp(n, vector<bool>(n , false));for( int j=0; j< n;j++){for (int i =0;i <= j; i++){if(s[i]==s[j] &&(j-i < 2 ||dp[i+1][j - 1])){dp[i][j]=true;ans++;}}}return ans;}};
看到有小马拉大车 中心扩展等方法。 下次一试。
