leetcode 500. 键盘行
一、题目
1.题目描述
给你一个字符串数组 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]
由英文字母(小写和大写字母)组成
2.基础框架
C++基础框架代码如下:
vector<string> findWords(vector<string>& words) {
}
3.解题思路
- 题目分析
- 首先键盘上
i
行的字母放入对应的字符串数组i
中,然后用hash数组以字母为key
,行数为value
的方式进行存储,这样当我们以key
的方式访问字母时,就可以得到它所在的行号。 - 另外由于存在大小写的情况,大写字母也按照上面的方式存储到hash数组中,不同的是,大写字母存储需要进行偏移。大写字母
A~Z
是在小写字母z
之后的,所以存储的位置为[A~Z] - 'A' + 26
。 - 对每组字符串进行比对,如果其中存在字母在不同行的情况,则在
words
数组的基础上直接进行erase()
删除,需要注意的是,这里需要--i
处理。因为erase()
删除后,当前i
指向的是下一组字符串。
-
实现代码:
vector<string> findWords(vector<string>& words) { vector<string> lrec = {"qwertyuiop", "asdfghjkl", "zxcvbnm"}; vector<string> hrec = {"QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM"}; vector<int> hash(52); int i, j; for (i = 0; i < lrec.size(); ++i) // 小写存入hash for (j = 0; j < lrec[i].size(); ++j) hash[lrec[i][j] - 'a'] = i; for (i = 0; i < hrec.size(); ++i) // 大写存入hash for (j = 0; j < hrec[i].size(); ++j) hash[hrec[i][j] - 'A' + 26] = i; for (i = 0; i < words.size(); ++i) { int row; if (words[i][0] >= 'a' && words[i][0] <= 'z') // 小写的情况 row = hash[words[i][0] - 'a']; else row = hash[words[i][0] - 'A' + 26]; // 大写的情况 for (j = 1; j < words[i].size(); ++j) { if (words[i][j] >= 'a' && words[i][j] <= 'z') // 小写的情况 { if (row != hash[words[i][j] - 'a']) { words.erase(words.begin() + i); --i; break; } } else // 大写的情况 { if (row != hash[words[i][j] - 'A' + 26]) { words.erase(words.begin() + i); --i; break; } } } } return words; }