R4-双指针专题
目录
起初我还想着用那个栈来做的,但是栈不好处理中心点
dp法(外向内扩展)
class Solution:
def longestPalindrome(self, s: str) -> str:
n=len(s)
if n<2:
return s
begin=0
mx=1
dp=[[False]*n for _ in range(n)]
for i in range(n):
dp[i][i]=True
#枚举字串长度
for l in range(2,n+1):
#左边界
for i in range(n):
#右边界j=l+i-1
j=l+i-1
if j>=n:
break
if s[i]!=s[j]:
dp[i][j]=False
else:
#长度为2以下
if j-i<3:
dp[i][j]=True
else:
dp[i][j]=dp[i+1][j-1]
#当查找到dp[i][j]==true就可以修改并返回了
if dp[i][j] and j-i+1>mx:
mx=j-i+1
begin=i
return s[begin:begin+mx]
中心扩展算法 (内向外扩展)
把上把的边界抓来当作回文中心,两边扩展
‘
class Solution:
def expand_fromcenter(self,s,left,right):
while left>=0 and right<len(s) and s[left]==s[right]:
left-=1
right+=1
#此时刚好不满足,会退一个就是最长的回文子串
return left+1,right-1
def longestPalindrome(self, s: str) -> str:
start,end=0,0
for i in range(len(s)):
#中心点奇数
left1,right1=self.expand_fromcenter(s,i,i)
#中心点偶数
left2,right2=self.expand_fromcenter(s,i,i+1)
if right1-left1>end-start:
start,end=left1,right1
if right2-left2>end-start:
start,end=left2,right2
return s[start:end+1]
ps:
还有马拉车算法