题目
分析
-
转换思想
求最长公共子序列长度,典型DP问题,但是这里有点不一样,需要把每个大写字母开头的字符串看成一个整体,这样问题就和LCS一样了!
(LCS是什么?看这里动态规划 Python篇)
定义一个用来切分字符串的函数,重新存储每一个大写字母开头的字符串,将其看作一个字符处理,因为python可以自动判别两个字符串是否相同! -
LCS模板
-
边界处理
一般dp问题我们都不用0下标,dp数组也开大一点,防止下标越界问题
同时也为了方便对应下标
代码
#把一串字符串根据首字母大写来分隔开
#LanQiaoBei
#['Lan', 'Qiao', 'Bei']
def getwords(s,length,w):
i = 0#用来循环
word = ""
while i < length:
if s[i].isupper():#如果当前字符是大写
word = s[i]#临时存储
i += 1#下标移动指向下一位
while i < length and s[i].islower():#判断是否越界 是否是小写字符
word += s[i]#小写就拼接
i += 1
w.append(word)#最终存储在w里
#print(w)
s1 = input()
s2 = input()
w1, w2 = [0], [0] # 设0避免下标越界
getwords(s1,len(s1),w1)
getwords(s2,len(s2),w2)
#print(w1)
#print(w2)
n=len(w1)#n-1才是真正长度,因为最前面插入了0
m=len(w2)
dp=[[0]*(m+1) for i in range(n+1)]
for i in range(1,n):
for j in range(1,m):
#print(i,j)
if w1[i]==w2[j]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
print(dp[n-1][m-1])