一、Problem
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示
输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]
注意:
你可以重复使用键盘上同一字符。
你可以假设输入的字符串将只包含字母
二、Solution
方法一:map
思路
这主要是比谁写的简单…
class Solution {
public:
vector<string> findWords(vector<string>& ws) {
if (ws.empty()) return {};
string lines[3] = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
unordered_map<char, int> m;
for (int i=0; i<3; i++)
for (char c : lines[i]) {
m[c] = m[c-32] = i;
}
vector<string> ans;
for (string& w : ws) {
unordered_set<int> st;
for (char c : w) st.insert(m[c]);
if (st.size() == 1) ans.emplace_back(w);
}
return ans;
}
};
可以优化的地方是:直接用 int t 统计字母所在行编号的总和,当 t == w.size()*m[c] 时,单词 w 有效
复杂度分析
- Time: O ( n ) O(n) O(n),
- Space: O ( n ) O(n) O(n)