leetcode之Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

 

Example:

Input: "cbbd"

Output: "bb"

题目大概意思就是找第一个最大的回文字符串;

这题有两种解法,

1.dp

dp的时间复杂度为O(n^2),似乎不是最好的方法

dp思路就是进行两次for循环,分别对i==j,i=j+1,s[i]==s[j]&&dp[i-1][j+1],进行讨论

class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        vector<vector<bool> >dp(n,vector<bool>(n));
        string res="";
        int max=1;
        res=s.substr(0,1);        //s.size()==1时的情况
        for(int i=0;i<s.size();i++){
            for(int j=0;j<=i;j++){
                if(i==j)            //i==j的情况
                    dp[j][i]=true;
                else{                
                    if(i==j+1)        //i=j+1,即'aa'的情况
                        dp[j][i]=s[i]==s[j];
                    else                    //后续的回文处理
                        dp[j][i]=s[i]==s[j]&&dp[j+1][i-1];
                    if(dp[j][i]&&i-j+1>max){
                        max=i-j+1;
                        res=s.substr(j,max);
                    }
                }
            }
        }
        return res;
    }
};

2、第二种方法就是从前往后寻找到回文开始的地方,然后分别往两边走,直到不再是回文

class Solution {
public:
    string longestPalindrome(string s) {
    	int n=s.size();
        if(n==0||n==1)return s;
        string res="";
        int max_l=1,min_l=0;
        for(int i=0;i<n;){
            if(n-i<=max_l/2)break;
            int j=i,k=i;
            while(k<n-1&&s[k]==s[k+1])k++;
            i=k+1;
            while(j>0&&k<n-1&&s[k+1]==s[j-1])k++,j--;
            int new_len=k-j+1;
            if(new_len>max_l){
                min_l=j;
                max_l=new_len;
            }
            res=s.substr(min_l,max_l);
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值