我在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)

10-06 06:25