目录
题目
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
来源:力扣(LeetCode)
链接:题目详情及示例https://leetcode-cn.com/problems/keyboard-row
思路与代码
方法一:set()去重取交集
将字符数组的元素全部改为小写然后用set()并与键盘每一行的字符取交集,若结果等于字符数组的元素则表示该字符可以由这一行打印出来。其中,需用另一个字符串存储未改变大小写前的字符串。
class Solution:
def findWords(self, words: List[str]) -> List[str]:
ans = []
lines = [set("qwertyuiop"),set("asdfghjkl"),set("zxcvbnm")]
for word in words:
reword = word
word = set(word.lower())
for line in lines:
if word & line == word:
ans.append(reword)
break
return ans
方法二:正则表达式
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:re.match(pattern, string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志 |
匹配成功re.match方法返回一个匹配的对象,否则返回None。
正则表达式 "^[asdfghjkl]*$" 表示 匹配 “asdfghjkl” 中所有的字符,其中
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
class Solution:
def findWords(self, words: List[str]) -> List[str]:
return [word for word in words if re.match("^[qwertyuiop]*$", word, re.I) or re.match("^[asdfghjkl]*$", word, re.I) or re.match("^[zxcvbnm]*$", word, re.I)]