我在 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(),我的运行时间为 36 毫秒,超过了所有提交的 94.87%。
3) 所以我想,嗯,这件作品有什么不同?根据我在这个主题上发现的一个问题The complextiy of Python issubset() ,方法2)的时间复杂度应该是O(len(word)),我相信这 block 应该是一样的:
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)
