Longest Palindromic Substring

LeetCode OJ 5:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

思路1:回文字符串是对称的,如果字符串长度为奇数,那么相对于最中间的字符对称。如果字符串长度为偶数,则相对于最中间的两个字符对称。利用这一特性,我们分别假设字符串的每一个字符为中间字符,并记录下回文字串的长度。最终遍历出最长的回文字符串。

class Solution {
public:
    string expandAroundCenter(string s, int c1, int c2) {  
        int l = c1, r = c2;  
        int n = s.length();  
        while (l >= 0 && r <= n-1 && s[l] == s[r]) {  
            l--;  
            r++;  
        }  
        return s.substr(l+1, r-l-1);  
    }  
    string longestPalindrome(string s) {
        int n = s.length();  
        if (n == 0) return "";  
        string longest = s.substr(0, 1); 
        for (int i = 0; i < n-1; i++) {  
            string p1 = expandAroundCenter(s, i, i); 
            if (p1.length() > longest.length())  
                longest = p1;  
            string p2 = expandAroundCenter(s, i, i+1); 
            if (p2.length() > longest.length())  
                longest = p2;  
        }  
        return longest;  
    }
};

思路2:除了思路1之后,此问题可以很容易的转化为求两个字符串最长相同子串的问题。需要注意的是,某些特殊情况下,需要进行indices的判断。

int longestCommonSubstr(const string& str1, const string& str2) 
{
    size_t size1 = str1.size();
    size_t size2 = str2.size();
    if (size1 == 0 || size2 == 0) return 0;
    vector<vector<int> > table(size1, vector<int>(size2, 0));
    int start1 = -1;
    int start2 = -1;
    int longest = 0; 
    int comparisons = 0;
    for (int j = 0; j < size2; ++j)
    {
        ++comparisons;
        table[0][j] = (str1[0] == str2[j] ? 1 :0);
    }
    for (int i = 1; i < size1; ++i)
    {
        ++comparisons;
        table[i][0] = (str1[i] == str2[0] ? 1 :0);
 
        for (int j = 1; j < size2; ++j)
        {
            ++comparisons;
            if (str1[i] == str2[j])
            {
                table[i][j] = table[i-1][j-1]+1;
            }
        }
    }
    for (int i = 0; i < size1; ++i)
    {
        for (int j = 0; j < size2; ++j)
        {
            if (longest < table[i][j])
            {
                longest = table[i][j];
                start1 = i-longest+1;
                start2 = j-longest+1;
            }
        }
    }
    return longest;
}
posted @ 2016-07-17 12:32  信步闲庭、、  阅读(136)  评论(0编辑  收藏  举报