最长回文数(中心延拓, 复杂度O(n^2) )

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
/*
 * 选取当前字符为中心,左右分别等步长扩张
 * "babad"
 *
 * 可以写一个函数 search传入 起始left, right.对于奇数形式的回文串 left=right 对于偶数形式right=left+1
 * 同时记录回文串的起始位置i和长度len
 * */
class Solution {
public:
    string longestPalindrome(string s) {
        if(s.length() < 2)  return s;
        int begin=0, maxlen=0;
        for(int i=0;i<s.length()-1;i++){// 对于只有一个字符特殊情况: 前面已经直接返回 不用再特判
            search(s, i, i, begin, maxlen);
            search(s, i, i+1, begin, maxlen);
        }
        return s.substr(begin, maxlen);
    }
    void search(string &s, int left, int right, int &begin, int &maxlen){
        while(left>=0 && right<s.length() && s[left]==s[right]){
            left--;right++;
        }
        // 注意跳出循环时  left多减了一次, right多加了一次 长度应为right-1 -(left+1)+1=right-left-1
        if(right-left-1>maxlen){
            maxlen = right-left-1;
            begin = left;
        }
    }
};

Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1:

Input: "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".
class Solution {
public:
   int search(string &s, int left, int right){
    int ret=0, len=s.size();
    while(left>=0 && left<len && s[left]==s[right]){
        left--;right++;ret++;
    }
    return ret;
}
int countSubstrings(string s) {
    if(s.empty())   return 0;
    int ret=1;
    for(int i=0;i<s.length()-1;i++){
        ret += search(s, i, i);
        ret += search(s, i, i+1);
    }
    return ret;
}

};

猜你喜欢

转载自blog.csdn.net/futangxiang4793/article/details/88850521