难度简单120
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。
示例:
输入: ["Hello", "Alaska", "Dad", "Peace"] 输出: ["Alaska", "Dad"]
注意:
- 你可以重复使用键盘上同一字符。
- 你可以假设输入的字符串将只包含字母。
好开心,居然通过了!然后还自己在LeetCode上发了一个题解,还第一次写题解呢!
思路是这样的:
按照键盘三行分别用集合去存储键盘字母,然后对单词数组里的每个单词进行判断。首先判断单词的首字母在哪一个集合里,然后用check函数判断剩下的字符是不是也在这个集合里,如果不是直接返回false。当check函数返回true时,说明这个单词可以用一行键盘打印,将其添加到结果数组中。最后返回结果数组即可。
注意这里用到了大小写转换函数:
char类型的tolower();
string类型的transform(str.begin(),str.end(),str.begin(),::tolower);
class Solution {
public:
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'};
vector<string> findWords(vector<string>& words) {
vector<string> res;
for(auto& str: words){
bool flag = false;
if(set1.count(tolower(str[0]))){
flag = check(str, set1);
}else if(set2.count(tolower(str[0]))){
flag = check(str, set2);
}else if(set3.count(tolower(str[0]))){
flag = check(str, set3);
}
if(flag == true){
res.push_back(str);
}
}
return res;
}
bool check(string str, unordered_set<char> set){
transform(str.begin(),str.end(),str.begin(),::tolower);
for(int i = 1; i < str.length(); i++){
if(!set.count(str[i])){
return false;
}
}
return true;
}
};
开心开心,继续努力继续加油!!!