码迷,mamicode.com
首页 > 其他好文 > 详细

Longest Palindromic Substring 解题报告

时间:2014-11-27 12:38:37      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   使用   sp   for   on   

  使用马拉车算法,时间复杂度为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;
}

 

Longest Palindromic Substring 解题报告

标签:style   blog   io   color   os   使用   sp   for   on   

原文地址:http://www.cnblogs.com/bowiehsu/p/4125934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!