Longest Palindromic Substring 解题报告

  使用马拉车算法,时间复杂度为O(n),算法详细解释在上一篇文章中。 

//
//  main.cpp
//  Longest Substring
//
//  Created by Bowie Hsu  on 14/11/21.
//  Copyright (c) 2014年 Bowie Hsu . All rights reserved.
//

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include "stdio.h"
#include "ctype.h"
using namespace std;

class Solution {
public:
    //预处理,将#号加入到原有的string中
    string preprosess(string s)
    {
        int n=s.length();
        //string oss;
        stringstream oss;  //调用sstream中的stringstream
        oss << '^';
        for (int i=0; i<n; ++i)
            oss<<"#"<<s[i];
            oss<<'#';
            oss<<'$';
            return oss.str();
        
    }
    
    string longestPalindrome(string s) {
      
        string output;
        int mx=0;
        int id=0;
        string l=preprosess(s);
        int n=l.length();
        int *p=new int[n];
        //Manacher算法
        for(int i=1;i<n-1;++i)
        {
          //简便写法
          p[i]=(mx>i)?min(mx-i, p[2*id-i]):1;
            
          while(l[i+p[i]]==l[i-p[i]])
             ++p[i];
          if(p[i]+i>mx)
         {
             mx=p[i]+i;
             id=i;
         }
        }
        //找到最大字串的位置与个数
        int maxnum=0;
        int center=0;
        for (int i=1;i<n-1; ++i)
        {   if(p[i]>maxnum)
        {
            maxnum=p[i];
          center=i;
        }
        }
    return s.substr((center-maxnum)/2,maxnum-1); //返回一个string
    }
   
};

int main()
{
    string input="ccd";
    string ans;
    Solution x;
    ans=x.longestPalindrome(input);
    cout<<ans<<endl;
}

 

posted @ 2014-11-27 11:13  老徐Bowie  阅读(166)  评论(0编辑  收藏  举报