Leetcode 5最長迴文子串

Leetcode 5最長迴文子串

題目

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

示例 1:

輸入: “babad” 輸出: “bab” 注意: “aba” 也是一個有效答案。 示例 2:

輸入: “cbbd” 輸出: “bb”

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

先用最笨的方法來解,不斷的遍歷字串,並判斷是否是迴文子串,如果是就和當前最長迴文子串的長度進行比較,如果更長一些就更新,否則不更新,繼續判斷下一個字串。寫一個判斷是否是迴文子串的函數,參數有字符串,左索引,右索引。
寫了半天只通過了一小半,還沒有完全暴力通過,不得不說自己代碼能力實在太弱了,錯誤代碼如下:

class Solution {
public:
    bool isHuiWen(string s,int i,int j){
        for(int a=i;a<(j+i)/2+1;a++){
            if(s[a]!=s[j-a+i]){
                return false;
            }
        }
        return true;
    }
    string longestPalindrome(string s) {
        int ans_left,ans_right,ans_length; 
        int len=s.length();
        for(int i=0;i<=len;i++){  //i 爲判斷的字串長度
            for(int j=0;j<=len-i;j++){  //j爲字串的左索引
                if(isHuiWen(s,j,j+i-1)){
                    //已經找到長度爲i的迴文子串,那麼同樣長度的其他迴文子串就不用再找了
                    ans_left=j;
                    ans_right=j+i-1;
                    ans_length=i;
                    break;
                }
            }
        }
        string ans=s.substr(ans_left,ans_length);
        return ans;
    }
};

沒太懂這裏到底是怎麼用到了動態規劃的方法思想
看了官方題解,大概理解了其中所蘊含的動態規劃思想:我們來看看回文串的特性,判斷‘ababa’是否是迴文子串時,如果已知’bab’是迴文子串了,那就只需判斷左右兩邊的字符是不是相同,如果相同就是迴文子串,這樣,就找到了動態規劃中熟悉的子問題和遞推關係:
這裏貼上官方給定題解:
在這裏插入圖片描述
同時,還有很多其他的解法去做這題。後續探索啦
這裏有一個寫的很詳細的題解,鏈接是最長迴文字串詳細題解
動態規劃代碼如下:

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;//迴文串起始位置
        int max=1;//迴文串最大長度
        vector<vector<int>>  dp(len,vector<int>(len));//定義二維動態數組
        for(int i=0;i<len;i++)//初始化狀態
        {
            dp[i][i]=1;
            if(i<len-1&&s[i]==s[i+1])
            {
                dp[i][i+1]=1;
                max=2;
                start=i;
            }
        }
        for(int l=3;l<=len;l++)//l表示檢索的子串長度,等於3表示先檢索長度爲3的子串
        {
            for(int i=0;i+l-1<len;i++)
            {
                int j=l+i-1;//終止字符位置
                if(s[i]==s[j]&&dp[i+1][j-1]==1)//狀態轉移
                {
                    dp[i][j]=1;
                    start=i;
                    max=l;
                }
            }
        }
        return s.substr(start,max);//獲取最長迴文子串
    }
};

作者:gpe3DBjDS1
鏈接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-c-by-gpe3dbjds1/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章