系统会为您提供两个字符串,AA和BB。查找AA和BB中是否都出现一个子字符串。
所有字符串仅包含小写拉丁字母。
在上方,您会看到hackerranck的一个问题。我编写了以下程序来解决它:
T = int(raw_input())
for t in xrange(T):
s1 = raw_input()
s2 = raw_input()
length1 = len(s1)
length2 = len(s2)
checked = list()
if length1<length2:
for letter in s1:
if len(checked)== 26:
break
if letter in checked:
next
checked.append(letter)
if letter in s2:
print "YES"
break
else:
print "NO"
else:
for letter in s2:
if letter in checked:
next
if len(checked)==26:
break
checked.append(letter)
if letter in s1:
print "YES"
break
else:
print "NO"
在添加之前,它工作正常if len(checked)==26: break
。我添加了这一行以使其效率更高,方法是只检查每个字母一次,并消除了提交过程中的超时错误,但是添加了这一行后,对于某些测试用例,我的程序的答案是错误的。为什么?
您的错误在这里:
if letter in checked:
next
next
是Python中的函数。使用if letter in checked: next
是无操作的,您也可以使用过pass
,因为它将仅引用函数对象而不调用它。当然不会continue
到下一个循环迭代。
所以,不管结果是什么letter in checked
就是,你继续补充letter
到checked
。由于checked
是列表,而不是集合,因此您将向列表中添加重复项,并且最终很容易获得26个以上的条目。
使用:
if letter in checked:
continue
并考虑使用一个集合checked
来使in
成员资格测试成为O(1)运算而不是O(N)。
说到集合,这基本上是一个集合相交问题;有没有出现在任何两个单个字母s1
和s2
。您正在正确测试集合是否不相交;因此请使用Python内置set类型。在最坏的情况下,这会执行O(N * M)循环,但是循环是在C代码中进行的:
print('NO' if set(s1).isdisjoint(s2) else 'YES')
通过使用set.isdisjoint()
未创建的新集合,仅返回布尔值。set(s1)
循环遍历所有内容s1
以生成该集合,set.isdisjoint()
一旦找到匹配项,该集合将尽早退出,针对该集合的每个匹配测试均为O(1)。
您可以查看是否根据长度进行交换s1
并s2
仍然可以改善测试时间:
if len(s1) > len(s2):
s1, s2 = s2, s1
print('NO' if set(s1).isdisjoint(s2) else 'YES')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句