*****(leetcode_string)Longest Palindromic Substring

来源:互联网 发布:电子相册在线制作软件 编辑:程序博客网 时间:2024/04/27 22:31

Longest Palindromic Substring

 Total Accepted: 29287 Total Submissions: 141909My Submissions

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.

Show Tags
 String
Have you met this question in a real interview? 
Yes
 
No

Discuss

1、动态规划:用二维数组来标记,flag[i][j]表示i~j之间的字符串是否为回文,i>=j时,flag[i][j]=true,这是因为s[i][i]是单字符的回文,当i>j时,为true,是因为判断 i~j=i+1的时候,s[i]==s[j]的话要根据i++~j--的flag值判断,即baa中判断aa这两个字符的时候 。 程序中

flag[i][j]=flag[i+1][j-1];

如果i>j时不设置true,就需要在程序中判断i>j的情况。

比如bcaa,当计算s从2到3的时候,s[2]==s[3],这时就要计算s[2+1] ?= s[3-1],总的来说,当i>j时置为true,就是为了考虑j=i+1这种情况。

接着比较s[i] ?= s[j],如果成立,那么flag[i][j] = flag[i+1][j-1],否则直接flag[i][j]=false 


class Solution {    public:    string longestPalindrome(string s) {        int  i,j,len = s.length(),l=0,r=0,max=1;        bool flag[len][len];        for(i=0;i<len;i++)            for(j=0;j<len;j++)                if(i>=j)                    flag[i][j]=true;                else                    flag[i][j]=false;        for(j=1;j<len;j++){            for(i=0;i<j;i++){                if(s[i]==s[j]){                    flag[i][j]=flag[i+1][j-1];                    if(flag[i][j] && max<j-i+1){                        max=j-i+1;                        l=i;                        r=j;                    }                }                else                    flag[i][j]=false;            }        }        return s.substr(l,max);        }};

2、中心扩散法:要注意奇数偶数个回文字符串。

class Solution {public:    string findPal(string &s, int left, int right)    {        if (left < 0)            return s.substr(left+1, 1);                    if (right >= s.size())            return s.substr(right-1, 1);                    while(0 <= left && right < s.size())        {            if (s[left] != s[right])                break;            left--;            right++;        }        left++;        right--;        return s.substr(left, right - left + 1);            }        string longestPalindrome(string s) {        if (s.size() == 0)            return "";                    string ret;        for(int i = 0; i < s.size(); i++)        {            string str = findPal(s, i - 1, i + 1);//奇数,以i为中心向两边扩散            if (str.size() > ret.size())                ret = str;                            str = findPal(s, i, i + 1);//偶数,以i和i+1为中心向两边扩散            if (str.size() > ret.size())                ret = str;        }        return ret;    }};


0 0
原创粉丝点击