leetcode刷題筆記新地址(仍在更新)
https://github.com/MyLinChi/LeetcodeNote
問題描述
給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”
問題分析
要判斷一個字符串是不是迴文串有點難,但如果知道它的字串是迴文串,再結合新進去的字符是否符合要求,就可以只考慮當前狀態而做出決策,也就是動態規劃。
假設表示輸入的字符串,表示s的第i個字符(從0開始),表示是否爲迴文串,若是則值爲1否則爲0。那麼可以寫出狀態轉移方程
代碼
#include<iostream>
#include<string>
using namespace std;
class Solution {
public:
char dp[1000][1000];
int index, lenMax;
string longestPalindrome(string s) {
int len, i, j;
for (len = 2; len <= s.length(); len++){
for (i = 0; i < s.length() - len + 1; i++){
j = i + len - 1;
if (dp[i + 1][j - 1] == 1 && s[i] == s[j]){
index = i;
lenMax = len;
dp[i][j] = 1;
}
else{
dp[i][j] = 0;
}
}
}
return s.substr(index, lenMax);
}
Solution(){
int i, j;
for (i = 0; i < 1000; i++){
for (j = 0; j < 1000; j++)
if (i == j || i == (j + 1))
dp[i][j] = 1;
else
dp[i][j] = 0;
}
index = 0;
lenMax = 1;
}
};
int main()
{
Solution S;
string s;
cin >> s;
cout << S.longestPalindrome(s) << endl;
return 0;
}