leetcode刷题笔记新地址(仍在更新)
https://github.com/MyLinChi/LeetcodeNote
问题描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
问题分析
要判断一个字符串是不是回文串有点难,但如果知道它的字串是回文串,再结合新进去的字符是否符合要求,就可以只考虑当前状态而做出决策,也就是动态规划。
假设
s
s
s表示输入的字符串,
s
[
i
]
s[i]
s[i]表示s的第i个字符(从0开始),
F
i
j
F_{ij}
Fij表示
s
[
i
]
.
.
.
s
[
j
]
s[i]...s[j]
s[i]...s[j]是否为回文串,若是则值为1否则为0。那么可以写出状态转移方程
F
i
j
=
F
(
i
+
1
)
(
j
−
1
)
&
&
s
[
i
]
=
=
s
[
j
]
F_{ij} = F_{(i+1)(j-1)}\&\&s[i]==s[j]
Fij=F(i+1)(j−1)&&s[i]==s[j]
F
i
i
=
1
(
i
=
1
,
2
,
.
.
.
,
s
.
l
e
n
g
h
)
F_{ii} = 1 (i = 1,2,...,s.lengh)
Fii=1(i=1,2,...,s.lengh)
Φ
=
1
(
令
空
串
也
是
回
文
串
)
\Phi = 1(令空串也是回文串)
Φ=1(令空串也是回文串)
代码
#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;
}