описание
Получая строку s, найти самую длинную подстроку палиндромной в сек. Можно считать, что длина максимум с 1000
Получая строку s, S, чтобы найти самую длинную подстроку-палиндром. Можно считать, что с максимальной длиной 1000
Примеры
идей
- Метод Метод 1 Торнадо, найти ЛонгАн
Лонган два вида: один вид баб, один вид Baab, т.е. (I, I) и (I, I + 1)
- Метод 2 динамического программирования
Ответ - питон
*方法1*
class Solution:
def check(self, s:string, a:int,b:int)->str:
while a>=0 and b<len(s) and s[a]==s[b]:
a-=1
b+=1
a+=1
b-=1
return s[a:b+1]
def longestPalindrome(self, s: str) -> str:
res = ""
for i in range(len(s)):
s2 = self.check(s,i,i)
s3 = self.check(s,i,i+1)
if len(res)<len(s2):
res = s2
if len(res)<len(s3):
res = s3
return res
*方法2*
def longestPalindrome(self, s: str) -> str:
res = ""
dp=[[0]*len(s) for i in range(len(s))]
for r in range(len(s)):#r=j-i 0~len-1 r为0时是一个元素,为1时为两个元素在一起
for i in range(len(s)-r): #i+r<=len-1(最大下标)
j=i+r
if i==j:
dp[i][j]=1
if i+1==j:
dp[i][j]=1 if s[i]==s[j] else 0
if i+2<=j:
dp[i][j]=dp[i+1][j-1] and s[i]==s[j]
if dp[i][j] and j-i+1>len(res):
res=s[i:j+1]
- C ++
*方法1*
class Solution {
private:
string check(string s, int a, int b){
while (a>=0 && b<=s.size() && s[a]==s[b])
{
a--;
b++;
}
a++;
b--;
return s.substr(a,b-a+1);
}
public:
string longestPalindrome(string s) {
string res("");
for (int i=0; i<s.size(); i++)
{
string s2 = check(s,i,i);
string s3 = check(s,i,i+1);
if (res.size()<s2.size())
res=s2;
if (res.size()<s3.size())
res=s3;
}
return res;
}
};
*方法2*
class Solution {
public:
string longestPalindrome(string s) {
int L = s.size();
string res("");
vector<vector<int>> dp(L,vector<int>(L));//全是0的二维数组
for(int r=0; r<L; r++)
for (int i=0; i<L-r; i++)
{
int j=i+r;
if (i==j)
dp[i][j]=1;
if (i+1==j)
dp[i][j]=s[i]==s[j]?1:0;
if (i+2<=j)
dp[i][j]=(dp[i+1][j-1] && s[i]==s[j])?1:0;
if (dp[i][j] && j-i+1>res.size())
res = s.substr(i,j-i+1);
}
return res;
}
};