【简单题】
给你一个字符串数组 words
,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符
"qwertyuiop"
组成。 - 第二行由字符
"asdfghjkl"
组成。 - 第三行由字符
"zxcvbnm"
组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]
输出:[]
示例 3:
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
思路:
设置3个哈希表,把这一行的所有字母映射为该行的行号。依次遍历vector中的字符串,先记录第一个的行号,往后遍历,如果他们与这个不同的话。就结束遍历当前字符串。如果遍历到最后都是一个行的话,就将该字符串入栈。
代码
cpp
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> ans;
string str1 = "qwertyuiop";
string str2 = "asdfghjkl";
string str3 = "zxcvbnm";
map<char, int> mp;
for (int i = 0; i < str1.length(); i++) {
char a = str1[i];
mp[a] = 1;
}
for (int i = 0; i < str2.length(); i++) {
char a = str2[i];
mp[a] = 2;
}
for (int i = 0; i < str3.length(); i++) {
char a = str3[i];
mp[a] = 3;
}
//遍历words 字符串数组
for (int i = 0; i < words.size(); i++) {
string str = words[i];
int row = 0;
char b = str[0];
b = (b >= 65 && b <= 90) ? b += 32 : b;
row = mp[b];
int j;
for (j = 1; j < str.length(); j++) {
char a = str[j];
if (a >= 65 && a <= 90) a += 32; // 大写转小写
if (mp[a] != row) {
break;
}
}
if (j == str.length()) {
ans.push_back(str);
}
}
return ans;
}
};
运行结果: