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'
万门大学-数据结构与算法,学习笔记