算法题:回文
2方法:中心扩展、两端收缩
2场景:判断是否回文/找最长回文子串,统计回文子串数量
中心扩展
中心扩展在什么时候好用?
判断是否回文以及找最长回文子串
要找最长回文子串,要一直试探子串是否回文,用中心扩展判断次数更少。虽然用两端收缩也可以,但会多一些计算!
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;
}
};
完整题目: 5. 最长回文子串
两端收缩
两端收缩在什么时候好用?统计回文子串数量!
这是因为要记忆数量!而两端收缩可以唯一确定一个子串!如果用中心拓展遍历,不方便计数!
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. 回文子串