给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这种问题我之前肯定暴力破解,后来看题解发现用bp来做,应该是最合适的方法。以前我其实只是听说过bp,但是从来没有很实际的用过(限于简单的背包),这次刷题还是让我更深刻的记住了动态规划这种方法,
用空间换时间,确实是那么回事哈。
详细的题解建议大家看题解中的官方视频,整挺好
我这个其实就是写了自己看,顺便凑个数,大家图一乐
class Solution {
public:
string longestPalindrome(string s) {
if(s.length()<=1){
return s;
}
int len=s.length(),begin=0,end=0;
bool dp[len][len];
for(int i=0;i<len;i++){
dp[i][i]=true;
}
for(int i=0;i<len;i++){
for(int j=0;j<i;j++){
if(i-j==1){
if(s[i]==s[j]){
dp[j][i]=true;
}
else{
dp[j][i]=false;
}
}
else{
// cout<<"#:"<<i<<" "<<j<<endl;
if(s[i]==s[j]&&dp[j+1][i-1]){
dp[j][i]=true;
}
else{
dp[j][i]=false;
}
}
if(dp[j][i]&&i-j>end-begin){
// cout<<"r:"<<i<<" "<<j<<endl;
end=i,begin=j;
}
}
}
return s.substr(begin,end-begin+1);
}
};
还有一件很重要的事情,大家记得提交的时候吧cout去掉,这个有点点费时间😂
带着这个cout,导致我超时一次