刷题日记最长回文子串
Posted lyz_fish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题日记最长回文子串相关的知识,希望对你有一定的参考价值。
刷题总结:
本题为:https://leetcode.cn/problems/longest-palindromic-substring/
MANCHE思想:向字符中插入#
作为隔离。
首先,看到题目,我认为可以通过中心扩散法。不过需要讨论奇数还是偶数。例如aa
和aba
这样子有些麻烦。如果处理一下,在每个字符串中间和两边插入#
,那么遍历任何字符的回文数都可以按照奇数计算。因为将原本相同的字符隔开了。
#manche 算法
s_ = "#"+"#".join(s)+ "#"
ans = 0
for index,value in enumerate(s_):
# 奇数:
left,right,n = index,index,len(s_)
while True:
left -= 1
right += 1
if left>=0 and right < n:#边界条件。类似于C++中的++left或者++right。
pass
else:
left += 1# 减多了加回来。回退一下。
right -= 1
break
if s_[left]==s_[right]:# 如果左右字串相同,继续循环。
pass
else:
left += 1# 遍历到不相等的边界,回退一下并跳出循环。
right -= 1
break
# print("ans\\t",s_[left:right+1])
if ans < (len(s_[left:right+1])-1)//2:
res = s_[left:right+1]
ans = (len(s_[left:right+1])-1)//2
return ''.join(res.split('#'))
- Z 字形变换
题目链接:https://leetcode.cn/problems/zigzag-conversion/
![class Solution:
def convert(self, s: str, numRows: int) -> str:
## 周期为: T= n+n-2=2*n-2
# 总共多少轮回: len(s)/T 向上取整
# 分段存储,竖着的是n,横着的是2n-1
# 用list存储每行的数,最多有1000个list
n,r = len(s),numRows
T = 2*numRows -2
mat = [['']*math.ceil(n/T)*(r-1) for i in range(r)]
x,y = 0,0
for index,value in enumerate(s):
mat[x][y] = value
if index % T < r-1:
x += 1
else:
x -= 1
y += 1
return ''.join(jack for i in mat for jack in i if jack)]
以上是关于刷题日记最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章