"""
字符串子序列
给定字符串s1和s2,判断s1是否为s2的子序列:
两个字符串中仅包含英文小写字母。
字符串s2可能会很长,s1是个短字符串。
字符串的一个子序列是原始字符串删除一些(也可不删)字符,
而不改变剩余字符相对位置形成的新字符串。
比如,xzp是xyzop的一个子序列,而xpy不是。
"""
def get_char_index(s):
"""
构建字符在字符串s中的索引字典。
:param s: 输入的字符串
:return: 字符索引字典,键为字符,值为该字符在字符串s中所有出现位置的列表
"""
index = {}
for i, item in enumerate(s):
index.setdefault(item, [])
index[item].append(i)
return index
def is_subsequence(s1, s2):
"""
判断字符串s1是否为字符串s2的子序列。
:param s1: 待判断的子序列
:param s2: 主字符串
:return: 布尔值,如果s1是s2的子序列,则返回True,否则返回False
"""
char_index = get_char_index(s2)
pre_index = -1
for item in s1:
if item not in char_index:
return False
for index in char_index[item]:
if index > pre_index:
pre_index = index
break
else:
return False
return True
if __name__ == '__main__':
s1 = "xzp"
s2 = "xyzop"
print(is_subsequence(s1, s2))
评论前必须登录!
注册