我在Leetcode(500键盘行)上进行编程,并且在讨论中碰到了set.issubset()。与我自己的答案进行比较后,有一个有趣的发现:
1)
def checkWord(self, word):
r1 = 'qwertyuiop'
r2 = 'asdfghjkl'
r3 = 'zxcvbnm'
row = 0
for idx, ch in enumerate(word):
if idx == 0:
row = 1 if ch in r1 else 2 if ch in r2 else 3
continue
coming_row = 1 if ch in r1 else 2 if ch in r2 else 3
if row != coming_row:
return False
return True
如果我以此提交,我将获得40毫秒的运行时间
2)
def checkWord(self, word):
r1 = 'qwertyuiop'
r2 = 'asdfghjkl'
r3 = 'zxcvbnm'
return set(word).issubset(r1) or set(word).issubset(r2) or set(word).issubset(r3)
如果使用issubset(),则运行时为36ms,超过所有提交的94.87%。
3)所以我想,嗯,这件作品有什么区别?根据我在此主题The complextiy of Python issubset()上发现的一个问题,方法2)的时间复杂度应为O(len(word)),我相信与此片段应该相同:
def checkWord(self, word):
r1 = set('qwertyuiop')
r2 = set('asdfghjkl')
r3 = set('zxcvbnm')
row = 0
for idx, ch in enumerate(word):
if idx == 0:
row = 1 if ch in r1 else 2 if ch in r2 else 3
continue
coming_row = 1 if ch in r1 else 2 if ch in r2 else 3
if row != coming_row:
return False
return True
但是,它的运行时间是32毫秒,比所有py3提交都要快100%...为什么issubset()比这慢?谢谢!
最佳答案
请注意,您的第一个版本的checkWord
函数不会检查ch
值是否设置在r3
中,因此避免了一次检查。
此外,在第二个版本的checkword
中,您将创建三个带有word
参数字符的集合。为什么在使用“ issubset”检查之前不存储集?您的代码将如下所示:
def checkWord3(word):
r1 = 'qwertyuiop'
r2 = 'asdfghjkl'
r3 = 'zxcvbnm'
s1 = set(word)
return s1.issubset(r1) or s1.issubset(r2) or s1.issubset(r3)
这是使用正则表达式的另一种解决方案:
r1 = re.compile("^[qwertyuiop]+$")
r2 = re.compile("^[asdfghjkl]+$")
r3 = re.compile("^[zxcvbnm]+$")
r1.match(word) or r2.match(word) or r3.match(word)