子序列(字符串)python(数据结构与算法)

1最长子序列:

给定一个字符串“s”,和一个整数k,找到其他字符串“t”,使得‘t’是给定字符串“s”的最大子序列,同时‘t’的每一个字符在字符串中必须出现k次。

示例:

输入:s = "baaabaacba",k=3

输出:baaabaaba

思路:

可以先求出一个字符串的所有子序列,然后再判断每个字符出现k次的子序列,但是这样时间复杂度肯定会边长。故可以把重点放在k上,直接判断每个字符出现次数大于k的字符串。

故首先求字符串中,每个字符出现的次数,然后筛选大于k的字符串,组成字符串。

统计每字符串的个数,可以用python内置函数Counter实现.

a = "abdbdaagddd"
from collections import Counter  
print(Counter(a))
Counter({'d': 5, 'a': 3, 'b': 2, 'g': 1})

可以看出d出现的次数为5,

 实现代码

import collections
def longestSub(s,k):
    result = list()
    c = collections.Counter(s)
    for i in s:
        if (c[i] >= k):
            result.append(i)
    return "".join(result)

s = "bacccbaacba" 
k = 2
longestSub(s,k)
Out[17]: 'bacccbaacba'

2检查子序列

给定两个字符串str1和str2,判断str1是否是str2的子序列,

思路1:使用双指针法

具体:设置两个指针分别两个字符串,一次对比两个指针所指元素,判断是否相等,若相等然后依次移动str1指针,否则,移动str2的指针,遍历整个字符串。具体步骤如下:

 

 

 

def isSubSequence2(str1,str2):
    m = len(str1)
    n = len(str2)
    
    j = 0 
    i = 0
    while j < m and i < n:
        if str1[j] == str2[i]:
            j = j + 1
        i = i + 1
    return j == m


str1 = "AXY"
str2 = "ADXCPY"
isSubSequence2(str1,str2)
Out[18]: True

思路2 :递归

理解以上思路后,使用递归同样也可以实现,

def isSubSequence(string1,string2,m,n):
    #base Cass
    if m == 0: return True
    if n == 0: return False
    
    #if last characters of two strings are matching
    if string1[m-1] == string2[n-1]:
        return isSubSequence(string1,string2,m-1,n-1)
    #if last characters are not matching
    return isSubSequence(string1,string2,m,n-1)

str1 = "AXY"
str2 = "ADXCPY"
isSubSequence(str1,str2,len(str1),len(str2))
Out[19]: True

3通过删除给定字符串的字符串的字符得到字典中最长的单词

给定一个l列表和一个字符串“str”,找到列表中最长的字符串,他可以删除给定字符串"str"中的一些字符来形成,

输入:dict = 【"ale","apple","monkey","plea"】, str="abpcplea"

输出:apple

思路:

这个问题就是判断字符串str1是否是str2的子符串,只是给了几个字符串,判断是否是一个字符串的子符串。

def findLongestString(words,s):
    result = ""
    length = 0
    for w in words:
        if length < len(w) and isSubSequence2(w,s):
            result = w 
            length = len(w)
    return result

words = ["ale","apple","monkey","plea"]
s = "abpcplea"
findLongestString(words,s)
Out[20]: 'apple'

万门大学-数据结构与算法,学习笔记

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值