题目链接:
方法一、遍历
我们为每一个英文字母标记其对应键盘上的行号,然后检测字符串中所有字符对应的行号是否相同。
-
我们可以预处理计算出每个字符对应的行号。
-
遍历字符串时,统一将大写字母转化为小写字母方便计算。
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> ans;
string rowIdx = "12210111011122000010020202";
for (auto & word : words) {
bool isValid = true;
char idx = rowIdx[tolower(word[0]) - 'a'];
for (int i = 1; i < word.size(); ++i) {
if(rowIdx[tolower(word[i]) - 'a'] != idx) {
isValid = false;
break;
}
}
if (isValid) {
ans.emplace_back(word);
}
}
return ans;
}
};
方法二、哈希
class Solution {
public:
unordered_set<char> check[3];
void update(string& s, int p) {//更新三个哈希表
for (auto t : s){
check[p - 1].insert(t);
}
}
bool isOk(string& s) {//判断字符串是否在同一行
int i;
for (i = 0; i < 3; i++) {//先判断可能在哪一行
if(check[i].count(s[0] | 32)) break;
}
for (auto t : s) {
if(!check[i].count(t | 32))//统一转小写判断
return false;
}
return true;
}
vector<string> findWords(vector<string>& words) {
vector<string>res;
string s1 = "qwertyuiop";
string s2 = "asdfghjkl";
string s3 = "zxcvbnm";
update(s1, 1), update(s2, 2), update(s3, 3);
for (auto t : words){
if(isOk(t)){
res.push_back(t);
}
}
return res;
}
};