500. 键盘行
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 “qwertyuiop” 组成。
第二行由字符 “asdfghjkl” 组成。
第三行由字符 “zxcvbnm” 组成。
示例 1:输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:输入:words = ["omk"]
输出:[]
示例 3:输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
提示:
- 1 <= words.length <= 20
- 1 <= words[i].length <= 100
- words[i] 由英文字母(小写和大写字母)组成
解题思路
使用3个set分别记录键盘每一行的所有字符,对每个字符串判断,是否字符串的每个字符都属于属于键盘的同一行
代码
class Solution {
public:vector<string> findWords(vector<string> &words) {vector<string> res;unordered_set<char> set1{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'};unordered_set<char>set2{'a', 's', 'd', 'f', 'g', 'h','j', 'k', 'l'};unordered_set<char>set3{'z', 'x','c', 'v','b', 'n','m'};for (string s:words) {int i = 0;for (; i < s.length(); ++i) {if (set1.find(tolower(s[i])) == set1.end())break;}if (i == s.length()) {res.push_back(s);continue;}i = 0;for (; i < s.length(); ++i) {if (set2.find(tolower(s[i])) == set2.end())break;}if (i == s.length()) {res.push_back(s);continue;}i = 0;for (; i < s.length(); ++i) {if (set3.find(tolower(s[i])) == set3.end())break;}if (i == s.length()) {res.push_back(s);continue;}}return res;}
};