题目描述:
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"] 输出:["Alaska","Dad"]
解题思路:把每一行的字母的大小写及其所属的行号作为两个键值对存入一个哈希表中,遍历输入的words的每一个word,要是word中有两个字符来自不同的行及键值对的值不一样,则break;否则存入输出向量res;
代码:
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
unordered_map<char, int> Words;
vector<string> findWords(vector<string>& words) {
vector<string> res;
string word;
//初始化查找表
for (char c : "qwertyuiopQWERTYUIOP")
Words[c] = 1;
for (char c : "asdfghjklASDFGHJKL")
Words[c] = 2;
for (char c : "zxcvbnmZXCVBNM")
Words[c] = 3;
for (int i = 0; i < words.size(); i++) {
word = words[i];
int flag = 1;
for (int k = 1; k < word.size(); k++) {
int m = Words[word[0]];
int n = Words[word[k]];
if (n - m != 0) {
flag = 0;
break;
}
}
//从头到尾flag都没变则把这个单词计入
if (flag == 1)
res.push_back(word);
cout << endl;
}//for
return res;
}
};
int main() {
vector<string> words = { "Hello","Alaska","Dad","Peace" },res;
Solution solution;
res = solution.findWords(words);
cout << res.size() << endl;
for (string s : res) {
cout << s << endl;
}
return 0;
}