给定输入 - 单词作为一组字符串 - 确定集合中包含的任何单词是否是集合中其他单词的后缀,如果是,则返回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()选项。
我相对较新并且还在学习,我认为它正在迭代我遇到问题的单词集。任何帮助,将不胜感激。感谢
答案 0 :(得分:3)
endswith
会很好 - 而且更简单,甚至可能更快。但这不是您的代码的主要问题。
第一个问题在这里:
if x.search(j):
return True
else
return False
当您第一次找到不匹配的对时,您将立即转到return False
,而不会测试任何其他字对。但是,如果所有对不匹配,您只想return False
,而不是任何对不匹配。
要解决此问题,请删除该else
子句,并在整个顶级循环后添加return False
。
但是你还有另一个问题需要解决:
while i != j:
由于您未在该循环中的任何位置重新分配或修改i
或j
,因此一旦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