目錄
- 兩端收縮
- 中心擴充套件
2方法:兩端收縮、中心擴充套件
2場景:統計迴文子串數量,最長迴文子串
兩端收縮
兩端收縮在什麼時候好用?統計迴文子串數量!
這是因為要記憶數量!而兩端收縮可以唯一確定一個子串!如果用中心擴充遍歷,不方便計數!
class Solution {
bool isPaliStr(string str, int left, int right){
if(right==left) return true;
while(left <= right){
if(str[left]!=str[right]) return false;
else if(str[left]==str[right]){
left++;
right--;
}
}
return true;
}
public:
int countSubstrings(string s) {
int n=s.length();
if(n==1) return 1;
int cnt=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++)
if(isPaliStr(s,i,j)) cnt++;
}
return cnt;
}
};
完整題目 647. 迴文子串
中心擴充套件
中心擴充套件在什麼時候好用?
試探最長子串!只記憶長度,不記憶數量!
用兩端收縮也可以!但會多一些計算!
class Solution {
private:
string findPalindromeSize(string str, int left, int right){
int n=str.length();
while(left>=0 && right<n && right<=n-1 && str[left]==str[right]){
left--;
right++;
}
return str.substr(left+1,right-left-1);
}
public:
string longestPalindrome(string s) {
string ret = "";
for(int i=0;i<s.length();i++){
string str1=findPalindromeSize(s, i, i);
string str2=findPalindromeSize(s, i, i+1);
ret = str1.length()>ret.length() ? str1 : ret;
ret = str2.length()>ret.length() ? str2 : ret;
}
return ret;
}
};