给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
解决方法:
我这里我使用的是动态规划可能时间复杂度O(n2)有点大,但是我是正在做这个。
- 我们想到一个串是否为回文串取决于它删去两边各一个字符的子串是否为回文串。
- 然后我们想一下边界情况。当串的长度为1它必然是一个回文串,为2时它是否为回文串取决于这两个字符是否相等。
- 代码中的i j 可以理解为串左右两边的指针,l可以理解为间距。
#include <iostream>
#include <cstring>
using namespace std;
string Slove(string s);
int main(){
string s;
cin >> s;
cout<<Slove(s);
return 0;
}
string Slove(string s){
int n = s.size();
int dp[n][n];
string ans;
//这里我想的是l是i和j的间距
for(int l=0;l<n;l++){
for(int i=0;i+l<n;i++){
int j = i + l;
//间距为0即子串为一个字符的时候,所以都是回文子串
if(l==0)
dp[i][j] = 1;
//间距为1,即为两个字符,只需要判断这两个字符是否相等即可
else if(l==1)
dp[i][j] = (s[i]==s[j]);
//当子串的大小大于2时,判断这个串的左右两边字符是否相等,以及除去这两个字符后的字串是否为回文串
else
dp[i][j] = (dp[i+1][j-1] && s[i]==s[j]);
//如果当前字符串为回文串并且这个串的大小大于所存储的最大值时更新ans
if(dp[i][j] && l+1>ans.size()){
ans = s.substr(i,l+1);
}
}
}
return ans;
}