该题解的思路是先将美式键盘的三行字母分别存入三个集合set_h、set_m、set_l中。然后遍历单词列表words,对于每个单词,统计其中出现的字符,存入集合check_set。最后判断check_set与set_h、set_m、set_l三个集合的并集,如果并集的大小等于set_h、set_m或set_l任一集合的大小,说明该单词的所有字母都在同一行,将其加入结果列表result中返回。
时间复杂度: O(n*m)
空间复杂度: O(m+n)
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
# 初始化美式键盘三行字母的集合
set_h = set(['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'])
set_m = set(['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
'A','S','D','F','G','H','J','K','L'])
set_l = set(['z', 'x', 'c', 'v', 'b', 'n', 'm',
'Z', 'X', 'C', 'V', 'B', 'N', 'M'])
result = []
for word in words:
check_set = set()
for c in word:
check_set.add(c) # 统计单词中出现的字母
# 判断单词字母是否都在同一行
if len(check_set.union(set_h)) == len(set_h) or \
len(check_set.union(set_m)) == len(set_m) or \
len(check_set.union(set_l)) == len(set_l):
result.append(word)
return result
```