最长的回文字符串

来源:互联网 发布:淘宝运营书籍推荐 编辑:程序博客网 时间:2024/05/22 07:07

Leecode中第五题,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.

http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html

1. 面对这个题目,最初都会想到一个时间复杂度为O(n^3)的算法,通过两个for循环判断子串是不是回文字符串。这种算法存在着很多的重复性判断。
2. 换一种思考方式,上一种方法通过直接判断给定的字符子串是否符合条件。第二种方法,通过从两端不断扩展字符串,直至不符合回文字符串的要求停止。例如:abcdcba字符串,d是回文字符串,从中间向两端扩展后cdc也是回文字符串。abba,bb是回文字符串,从两端扩展得到的abba也是回文字符串。这种方法,要分两种情况,从上面的例子也可以看出,回文字符串长度为奇数和偶数的情况。

string longestPalindrome(string s) {        int mid,start,end;        string result;//存放最长的回文字符串        int max_length,length;        int n=s.length();        if(s.length()==0 ||s.length()==1)            return s;        max_length=1;        result=s.substr(0,1);        for(mid=1;mid<n-1;mid++)//回文字符串长度为奇数        {            start=mid-1;            end=mid+1;            while(start>=0 && end<n && s[start]==s[end])            {                start--;                end++;            }            length=end-start-1;            if(max_length<length)            {                max_length=length;                result=s.substr(start+1,length);            }        }        for(mid=0;mid<n-1;mid++)//回文字符串为偶数长度        {            if(s[mid]!=s[mid+1])                continue;            start=mid-1;            end=mid+2;            while(start>=0 && end<n &&s[start]==s[end])            {                   start--;                end++;            }            length=end-start-1;            if(max_length<length)            {                max_length=length;                result=s.substr(start+1,length);            }        }            return result;    }

3 第三种思路是运用动态规划的思想,其基本思路也是第二种方法的思想。动态规划思想,就是避免了计算重复的数据。方法采用了一个两维数组存储子字符串是否是回文字符从。

string longestPalindromeDP(string s) {  int n = s.length();  int longestBegin = 0;  int maxLen = 1;  bool table[1000][1000] = {false};//存储子字符串是否是回文字符串  for (int i = 0; i < n; i++) {    table[i][i] = true;  }  for (int i = 0; i < n-1; i++) {    if (s[i] == s[i+1]) {      table[i][i+1] = true;      longestBegin = i;      maxLen = 2;    }  }  for (int len = 3; len <= n; len++) {    for (int i = 0; i < n-len+1; i++) {      int j = i+len-1;      if (s[i] == s[j] && table[i+1][j-1]) {        table[i][j] = true;        longestBegin = i;        maxLen = len;      }    }  }  return s.substr(longestBegin, maxLen);}

4.An O(N) Solution (Manacher’s Algorithm)这种方法,下面的网址有提到

http://blog.csdn.net/ggggiqnypgjg/article/details/6645824

0 0
原创粉丝点击