给定一个字符串s,找出最长的回文子串

来源:互联网 发布:海洋cms采集插件 编辑:程序博客网 时间:2024/05/22 12:39

思路1:

 1 从每一个回文对称点开始向左右遍历,直到左右字符不相等。求出最长子串。

2 考虑回文子串可能是奇数长度,对称点只有一个。也可能是偶数长度。对称点有俩个

代码:

string longestPalindrome(string s) {        int len=s.length();        string result="";        if(len==0)            return result;        for(int i=0;i<len;i++){   //对称点是奇数点            int left=i;            int right=i;            while(left>0&&right<len-1&&s[left-1]==s[right+1]){                left--;                right++;            }            if(right-left+1>result.length()){                result=s.substr(left,right-left+1);            }        }        for(int i=0;i<len;i++){   //对称点是偶数点            if(s[i]==s[i+1]){      //俩个对称点                int left=i;                int right=i+1;                while(left>0&&right<len-1&&s[left-1]==s[right+1]){                    left--;                    right++;                }                if(right-left+1>result.length()){                    result=s.substr(left,right-left+1);                }            }        }        return result;    }

思路2:

动态规划

 string longestPalindrome(string s) {        int len=s.length();        string result="";        if(len==0)            return result;        int maxLen=0;        int start=0;        int end=0;        vector<vector<bool>> dp(len,vector<bool>(len,false));        for(int j=0;j<len;j++){            for(int i=0;i<j;i++){                if(s[i]==s[j]&&(j-i<=2||dp[i+1][j-1])){                    dp[i][j]=true;                    if(j-i+1>maxLen){                        maxLen=j-i+1;                        start=i;                        end=j;                    }                }            }        }        return s.substr(start,end-start+1);    }

思路3

遍历字符串,每次先查找相同的字符数量,然后下一个起始位置就是不相同的字符。

string longestPalindrome(string s) {        int len=s.length();        if(len==0)            return "";        int maxLen=1;        int start=0;        int left=0;        int right=0;        for(int i=0;i<len&&len-i>maxLen/2;){              left=i;            right=i;            while(right<len-1&&s[right+1]==s[right])   //重复字符                right++;            i=right+1;  //下一次字符的起始位置            while(right<len-1&&left>0&&s[left-1]==s[right+1]){                right++;                left--;            }            if(maxLen<right-left+1){                maxLen=right-left+1;                start=left;            }        }        return s.substr(start,maxLen);    }




阅读全文
0 0
原创粉丝点击