แนวคิด
ได้รับรายการคำ ให้หาคำที่พิมพ์ได้โดยใช้ตัวอักษรบนแถวเดียวของคีย์บอร์ดมาตรฐาน
เช่น ถ้าอินพุตคือ ["hello","world","mom","dad","try","type","tom"] ผลลัพธ์คือ ["dad","try","type"]
วิธีแก้:
- กำหนดอาร์เรย์ output
- oneRow := true
- กำหนด map charToRowMap เก็บคู่ {ตัวอักษร, แถว} ตัวอักษรบนคีย์บอร์ดและหมายเลขแถว
- สำหรับแต่ละคำใน words array:
- ถ้าคำไม่ว่าง: oneRow := true, row := charToRowMap[tolower(word[0])], วนลูป i := 1 ถึงความยาว word - 1: ถ้า charToRowMap[tolower(word[i])] ไม่เท่ากับ row: oneRow := false, ออกจากลูป
- ถ้า oneRow ไม่เป็นศูนย์: แทรกคำลงท้าย output
- คืนค่า output
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v) {
cout << "[";
for(int i = 0; i<v.size(); i++) {
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> output;
bool oneRow = true;
unordered_map<char, int> charToRowMap{
{'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}
};
for (auto word : words)
if (!word.empty()) {
oneRow = true;
int row = charToRowMap[tolower(word[0])];
for (int i = 1; i < word.length(); i++)
if (charToRowMap[tolower(word[i])] != row) {
oneRow = false;
break;
}
if (oneRow) output.push_back(word);
}
return output;
}
};
main() {
Solution ob;
vector<string> v = {"hello","world","mom","dad","try","type","tom"};
print_vector(ob.findWords(v));
}
อินพุต
{"hello","world","mom","dad","try","type","tom"}
เอาต์พุต
[dad, try, type, ]