給定一個字符串,你的任務是計算這個字符串中有多少個迴文子串。
具有不同開始位置或結束位置的子串,即使是由相同的字符組成,也會被計爲是不同的子串。
示例 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數組記錄是或者否就行了
class Solution {
public:
int ans=0;
int countSubstrings(string s) {
int N=s.size();
//dp只是表示i到j的字符串是不是迴文串
vector< vector<bool> > dp(N,vector< bool >(N,false));
for(int i=N-1;i>=0;i--)
{
for(int j=i;j<N;j++)
{
//兩種情形:在有相同的字符的情況下,如果字符串長度不超過3
//那麼是迴文串,或者中間夾的那個字符串是迴文串,總字符串就
//迴文串
if(s[i]==s[j]&&(j-i<3||dp[i+1][j-1]))
{
dp[i][j]=true;
ans++;
}
}
}
return ans;
}
};
雙指針法:
對每一個字符串的字符遍歷,在兩端的字符相同的情況下利用兩個指針向兩邊擴展
class Solution {
public:
int n=0;
void Count(string s,int i,int j)//i左移,j右移
{
while(i>=0&&j<s.size()&&s[i]==s[j])
{
n++;
i--;
j++;
}
}
int countSubstrings(string s) {
for(int i=0;i<s.size();i++)
{
Count(s,i,i);//計算迴文是奇數的迴文字符串
Count(s,i,i+1);//計算迴文是偶數的迴文字符串
}
return n;
}
};