在混乱的字符串中查找子字符串

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。 已修复,我错过了角落案例。 非常感谢。你能解释一下你是怎么修的吗?我能理解你以前的代码,但不是这个。

以上是关于在混乱的字符串中查找子字符串的主要内容,如果未能解决你的问题,请参考以下文章

数组篇在python中如何查找最长字符串子串

在混乱的字符串中查找子字符串

字符串子串的查找

C++编程,查找字符串子串并替换。

[在python中使用正则表达式搜索字符串子字符串

如何更改python字符串子字符串信息