在混乱的字符串中查找子字符串
Posted
技术标签:
【中文标题】在混乱的字符串中查找子字符串【英文标题】:Finding a substring in a jumbled string 【发布时间】:2020-06-28 13:52:41 【问题描述】:我正在编写一个脚本 - includes(word1, word2) - 它将两个字符串作为参数,并查找 word1 是否包含在 word2 中。 Word2 是一个字母混乱。它应该返回布尔值。也允许重复字母,我只检查字母是否以相同的顺序包含在两个单词中。
>>>includes('queen', 'qwertyuytresdftyuiokn')
True
'queen', 'QwertyUytrEsdftyuiokN'
我尝试将每个单词转换为列表,以便更轻松地处理每个元素。我的代码是这样的:
def includes(w1, w2):
w1 = list(w1)
w2 = list(w2)
result = False
for i in w1:
if i in w2:
result = True
else:
result = False
return result
但问题是我还需要检查 word1 的字母在 word2 中的顺序是否相同,而我的代码无法控制它。我找不到用列表实现它的方法。就像我不能用字符串做很多事情一样,所以我认为我需要使用另一种数据结构,比如字典,但我对它们了解不多。
【问题讨论】:
【参考方案1】:如果您不只是检查子字符串:
def include(a, b):
a = "".join(set(a)) # removes duplicates
if len(a) == 1:
if a in b:
return True
else:
return False
else:
try:
pos = b.index(a[0])
return include(a[1:], b[pos:])
except:
return False
print(include('queen', 'qwertyuytresdftyuiokn'))
#True
【讨论】:
【参考方案2】:我希望我明白你的目标是什么。 Python 不是我的菜,但我认为我把它变成了 Pythonic:
def is_subsequence(pattern, items_to_use):
items_to_use = (x for x in items_to_use)
return all(any(x == y for y in items_to_use) for x, _ in itertools.groupby(pattern))
https://ideone.com/Saz984
解释:
itertools.groupby 转移pattern
的方式是丢弃构成重复项
all
items form form grouped pattern
必须满足条件
any
使用生成器 items_to_use
,只要它与当前项目不匹配。请注意,items_to_use
必须在最终表达式之外定义,因此每次验证来自 pattern
的下一项时都会保持其进度。
【讨论】:
您的代码几乎总是有效,但问题是当第一个单词连续具有相同字母时,它不会返回 true。即使 word1 中重复的字母在 word2 中只找到一次,它也应该返回 true。 已修复,我错过了角落案例。 非常感谢。你能解释一下你是怎么修的吗?我能理解你以前的代码,但不是这个。以上是关于在混乱的字符串中查找子字符串的主要内容,如果未能解决你的问题,请参考以下文章