《剑指offer》面试题95:最长公共子序列(python实现)

题目:
输入两个字符串,请求出它们的最长公共子序列长度。如果从字符串s1中删除若干字符之后能得到s2,那么字符串s2就是字符串s1的一个子序列。例如,从字符串’abcde‘中删除两个字符之后得到字符串’ace‘,因此‘ace’是字符串’abcde’的一个字符列。但字符串‘aec’不是字符串’abcde’的一个子序列。如果输入字符串’abcde’和’badfe’,那么它们的最长公共子序列是’bde’,因此输出3.

分析:
作者是用动态规划的思路写的,但是我觉得没必要用动态规划。以求字符串’abcde’和’badfe’的最长公共子序列为例,设s1=‘abcde’,s2=‘badfe’,从s1的第一个字母开始,看是否在s2中,如果在,就记录下来,然后看s2的第二个字母,如果也在s2中,且位置处于第一个字母位置之后,那也记下来,直到遍历完s1.最后就看记录了几个位置,那就是公共子序列的长度。

str1 = 'abcde'
str2 = 'badfe'
str2 = list(str2)
locations = []
for i in str1:
    if i in str2:
        location = str2.index(i)
        locations.append(location)
        # 这里直接把str2分割,可以减少判断后面发现的字母是否在前面发现的字母的位置之后
        str2 = str2[location+1:]
print(len(locations))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值