Longest Palindromic Substring Using C++

/Author: yqtao
//Email : [email protected]
//Date :2016.7.4
/**************************************************************
*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.
*
*S=”abadcacd” ,return “dcacd”
************************************************************************/
解析:
题目的意思是让求最长的回文字串,例如S=”abadcacd” ,return “dcacd”这样。
定义i为中间的指针,即不让其越界的指针,
定义j为一个字串的开始指针,
定义k为一个字串的结束指针。
例如,当i=5是s[i]=a,则另 j=k=i=5,因此让k后移一位,与j前移一位比较两者是否相等,若等,则k++,j–;再次进行比较,因此就能得出他的最长回文字串了,想法非常的巧妙。
需要注意的是当s.size() - i <= max_len / 2时,此时直接返回,因为即使后面全是回文的也是与maxlen相等。

#include<iostream>
#include <algorithm>
#include <string>
using namespace std;
string longestPalindrome(string s) {
    if (s.empty()) return "";
    if (s.size() == 1) return s;
    int min_start = 0, max_len = 1;      //
    for (int i = 0; i < s.size();) {
        if (s.size() - i <= max_len / 2) break;
        int j = i, k = i;       //j is a pre pointer,k is next pointer
        while (k < s.size() - 1 && s[k + 1] == s[k])
            ++k; // Skip duplicate characters.
        i = k + 1;
        while (k < s.size() - 1 && j > 0 && s[k + 1] == s[j - 1]) 
        {
            ++k; 
            --j; 
        } // Expand.
        int new_len = k - j + 1;
        if (new_len > max_len) 
        {
            min_start = j;
            max_len = new_len; 
        }
    }
    return s.substr(min_start, max_len);
}
//测试
int main()
{
    string s = "abadcacd";
    string result = longestPalindrome(s);
    cout << result << endl;
}

你可能感兴趣的:(LeetCode)