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)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。