*问题:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
分析:提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
字符串逆转:
def reversal(str):
return str[::-1]
求最长公共子序列
def subsequence(str1,str2):
lena=len(str1)
lenb=len(str2)
c=[[0 for i in range(lenb+1)] for j in range(lena+1)]
flag=[[0 for i in range(lenb+1)] for j in range(lena+1)]
for i in range(lena):
for j in range(lenb):
if str1[i] == str2[j]:
c[i+1][j+1] = c[i][j]+1
flag[i+1][j+1] = 'ok'
elif c[i+1][j]>c[i][j+1]:
c[i+1][j+1] = c[i+1][j]
flag[i+1][j+1] = 'left'
else:
c[i+1][j+1]=c[i][j+1]
flag[i+1][j+1] = 'up'
return c[lena][lenb]
判断一个字符串是否是回文字符串
def panlindrome(str):
length = len(str)
if length %2 == 0:
for i in range(int(length/2)):
if str[i] != str[length-1-i]:
return False;
else:
for i in range(int((length -1)/2)):
if str[i] != str[length-1-i]:
return False;
return True
打印矩阵
def printLcs(flag,a,i,j):
if i==0 or j==0:
return
if flag[i][j]=='ok':
printLcs(flag,a,i-1,j-1)
print(a[i-1],end='')
elif flag[i][j]=='left':
printLcs(flag,a,i,j-1)
else:
printLcs(flag,a,i-1,j)