键盘行
❤️ 简单
题目介绍
给你一个字符串数组 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] 由英文字母(小写和大写字母)组成
思路分析
目标:
给出string数组,若该数组是在键盘的同一行的,按一定格式输出该数组
明确:
- 26个字母,每一行不重复
- 输入有大小写,是否要探讨大小写
- 根据ASCⅡ表,每一个字符有对应的值,而且26个字母按照顺序排列
- 不必要的判断可以跳过,例如判断某一个字串,存在一个字符与前面的字符不在一行上,就可以跳过该字符
思路
- 因为每一行的字符是确定的,26个字母在ASCⅡ表上是顺序排列的,所以对 ”abcdefghijklmnopqrstuvwsyz",我们可以根据他们的顺序如上两点,确定一个所在行的字符串 m=“12210111011122000010020202”
- 对于字符串集words,遍历每一个数组,判断是否在同一行
- 对于数组,逐个字符判断,对照字符串m确定前一个字符是否与后一个字符在同一行上
- 对于大写字母 ,字符串m[word[i][j]-‘A’+0],正好对应了字符word[i][j]所对应的行
- 大小写有干扰,所以使用函数,将字符变成小写
代码
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> answer;bool flag;char c;
string m = "12210111011122000010020202";
for (auto & word : words) {
flag = true;//判断
c = m[tolower(word[0]) - 'a'];//确定第一个字符所在行
for (int i = 1; i < word.size(); ++i) {
if(m[tolower(word[i]) - 'a'+0] != c) {
flag = false;
break;
}
}
if (flag) {
answer.emplace_back(word);//在同一行,将该字串加入向量answer中
}
}
return answer;
}
};