Cho danh sách từ, tìm các từ có thể gõ chỉ dùng các ký tự trên một hàng bàn phím QWERTY chuẩn.
Hàng 1: q w e r t y u i o p
Hàng 2: a s d f g h j k l
Hàng 3: z x c v b n m
Ví dụ: ["hello","world","mom","dad","try","type","tom"] → ["dad","try","type"]
Giải thuật
- Tạo map
char → hàngcho 26 chữ cái. - Với mỗi từ, xác định hàng của ký tự đầu, kiểm tra các ký tự còn lại có cùng hàng không.
- Nếu có, thêm vào kết quả.
Ví dụ triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<string> findWords(vector<string>& words) {
unordered_map<char, int> row = {
{'q',1},{'w',1},{'e',1},{'r',1},{'t',1},{'y',1},{'u',1},{'i',1},{'o',1},{'p',1},
{'a',2},{'s',2},{'d',2},{'f',2},{'g',2},{'h',2},{'j',2},{'k',2},{'l',2},
{'z',3},{'x',3},{'c',3},{'v',3},{'b',3},{'n',3},{'m',3}
};
vector<string> res;
for (string w : words) {
if (w.empty()) continue;
int r = row[tolower(w[0])];
bool ok = true;
for (char c : w) {
if (row[tolower(c)] != r) { ok = false; break; }
}
if (ok) res.push_back(w);
}
return res;
}
};
void print(vector<string> v) {
cout << "[";
for (int i = 0; i < v.size(); i++) cout << v[i] << (i+1
Đầu vào / Đầu ra
Input: {"hello","world","mom","dad","try","type","tom"}
Output: ["dad", "try", "type"]