在一组字符串中查找后缀,Python

在一组字符串中查找后缀,Python,python,Python,给定一个输入-单词作为一组字符串-确定集合中包含的任何单词是否是集合中其他单词的后缀,如果是,则返回True,如果不是,则返回False 我尝试过的方法: import re def findsuffix(words_set): for i in words_set: x = re.compile('w*'+i) for j in words_set: while i != j: if x.searc

给定一个输入-单词作为一组字符串-确定集合中包含的任何单词是否是集合中其他单词的后缀,如果是,则返回True,如果不是,则返回False

我尝试过的方法:

import re
def findsuffix(words_set):
    for i in words_set:
        x = re.compile('w*'+i)
        for j in words_set:
            while i != j:
                if x.search(j):
                    return True
                else
                    return False
我也尝试过使用.endswith选项

我是一个比较新的人,还在学习,我想这是在重复我遇到问题的单词集。任何帮助都将不胜感激。谢谢

endswith会很好,简单得多,甚至更快。但这不是代码的主要问题

第一个问题是:

if x.search(j):
    return True
else
    return False
第一次发现一对不匹配的词时,将立即返回False,而不测试任何其他词对。但您只希望在所有对都不匹配时返回False,而不是在任何对都不匹配时返回False

要解决这个问题,只需删除else子句,并在整个顶级循环之后加上returnfalse

但您还有另一个问题需要解决:

while i != j:
因为您不会在循环中的任何位置重新分配或修改i或j,一旦i!=j是真的一次,永远都是真的。所以,您将永远循环,测试相同的两个值

这里需要的是if语句:

if i != j:
学习如何调试流控件将非常有帮助。您可以通过在适当的位置添加诸如print'About to check{}.formatj之类的行,并查看打印出的内容,来进行快速脏调试。但是学习使用调试器或类似的在线可视化工具要好得多。

这是我的解决方案,具有On log n时间复杂性,而不是On*n:


您要查找的数据结构是两个后缀树的交集。这看起来很有趣,请您详细说明一下描述好吗我的英语不够好,无法清楚地描述它:,我希望代码本身能做到。这真的很聪明@在user3636636中,该算法依赖于首先反转单词集中的单词,然后进行排序。对于具有相同初始字符序列的两个单词,较短的单词将在较长的单词之前排序,这将产生一个列表,其中相邻的项目是具有匹配前缀的候选项,该前缀实际上是后缀,因为单词被颠倒了。然后,通过压缩排序列表本身的偏移量来比较相邻单词,并使用startswith检查前缀。排序的复杂性取决于日志n,因此总体上取决于日志n。
def findsuffix(words_set):
    words_set = set(words_set)
    for i in words_set:
        for j in words_set:
            if i == j:
                continue
            if i.endswith(j) or j.endswith(i):
                return True
    return False
def findsuffix(word_set):
    ws = sorted(w[::-1] for w in word_set)
    return any(y.startswith(x) for x, y in zip(ws[:-1], ws[1:]))

findsuffix(['abcdef', '123', 'cdef'])
Out[1]: True

findsuffix(['abcdef', '123', 'cdefg'])
Out[2]: False