1.最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
方法一:动态规划
#方法一:动态规划
def longestPalindrome(s):
max_len=1 #初始化最大长度
start = 0 #初始化索引
dp=[[False]*len(s) for i in range(len(s))]
cur_len=0
for j in range(1,len(s)):
for i in range(j):
if j-i<=2:
if s[i]==s[j]: #特殊情况,只有2个元素,只要保证一头一尾相等即可
dp[i][j]=True
cur_len=j-i+1
else:
if s[i]==s[j] and dp[i+1][j-1]==True: #要保证头尾相等,同时内部也是回文数
dp[i][j]=True #状态转移方程
cur_len=j-i+1
if dp[i][j]: #是回文串则要进行更新
if cur_len>max_len:
start=i
max_len=cur_len
return s[start:start+max_len] #输出子串
方法二:中心扩散法
#方法二:中心扩散法
def longestPalindrome(s):
res=''
for i in range(len(s)):
l,r=i-1,i+1 #回文串为奇数的情况,中心坐标向左右两边扩散
while l>=0 and r<len(s) and s[l]==s[r]:
l,r=l-1,r+1 #继续扩散
if r-l-1>len(res):
res=s[l+1:r]
l,r=i,i + 1 #回文串为偶数情况,从中心和中心右边开始扩散
while l>=0 and r<len(s) and s[l]==s[r]:
l,r=l-1,r+1 #向两边扩散
if r-l-1>len(res):
res=s[l+1:r]
return res
2.括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
方法一:动态规划
#方法一:动态规划
def generateParenthesis(n):
dp=[[] for i in range(n+1)]
dp[0]=['']
for i in range(1,n+1): #关键是f(n)=(f(i))f(n-i-1)就是在之前结果中再加一对括号,
for p in range(i): #插入的方式有很多种,逐个遍历
l1=dp[p]
l2=dp[i-p-1]
for k1 in l1:
for k2 in l2:
tem='('+k1+')'+k2
dp[i].append(tem)
return dp[n]