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

时间:2014-08-12 01:12:47

标签: 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.search(j):
                    return True
                else
                    return False

我也尝试过.endswith()选项。

我相对较新并且还在学习,我认为它正在迭代我遇到问题的单词集。任何帮助,将不胜感激。感谢

3 个答案:

答案 0 :(得分:3)

endswith会很好 - 而且更简单,甚至可能更快。但这不是您的代码的主要问题。


第一个问题在这里:

if x.search(j):
    return True
else
    return False

当您第一次找到不匹配的对时,您将立即转到return False,而不会测试任何其他字对。但是,如果所有对不匹配,您只想return False,而不是任何对不匹配。

要解决此问题,请删除该else子句,并在整个顶级循环后添加return False


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

while i != j:

由于您未在该循环中的任何位置重新分配或修改ij,因此一旦i != j为真,它将永远属实。所以,你将永远循环,测试相同的两个值。

这里你想要的是if声明:

if i != j:

学习如何调试流控制真的很有帮助。您可以通过在适当的位置添加print('About to check {}'.format(j))等行来查看快速和脏调试,并查看打印出来的内容。但是学习使用调试器或像this one这样的在线可视化工具要好得多。

答案 1 :(得分:2)

这是我的解决方案,( O(n log n)时间复杂度而不是 O(n * n)):

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

答案 2 :(得分:1)

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