ให้รายการคำถาม (queries) และ pattern ต้องการคืนอาร์เรย์ boolean ที่ answer[i] = true ก็ต่อเมื่อ queries[i] จับคู่ (match) กับ pattern โดยนิยามว่า: สามารถแทรกตัวอักษรเล็ก (lowercase) เข้าไปใน pattern ได้จนเท่ากับ query
ตัวอย่าง: queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB" → [true,false,true,false,false]
ขั้นตอนการแก้ปัญหา (Trie)
- สร้าง Trie จาก
pattern(เฉพาะตัวอักษรใน pattern) - สำหรับแต่ละ
query:- เดินตาม Trie ตามตัวอักษรของ query
- ถ้าตัวอักษรมีใน Trie → เดินต่อ
- ถ้าไม่มีใน Trie แตเป็นตัวพิมพ์ใหญ่ (A-Z) → ไม่จับคู่ (เพราะ pattern ไม่มีตัวนั้น)
- ถ้าไม่มีใน Trie และเป็นตัวเล็ก → ข้ามไป (ถือว่าเป็นตัวที่แทรกเพิ่ม)
- จับคู่สำเร็จก็ต่อเมื่อเดินจนจบ query และอยู่ที่โหนดสิ้นสุดของ pattern
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
bool isEnd = false;
unordered_map<char, Node*> child;
};
class Solution {
public:
void insertNode(Node* head, string s) {
Node* curr = head;
for (char c : s) {
if (!curr->child[c]) curr->child[c] = new Node();
curr = curr->child[c];
}
curr->isEnd = true;
}
vector<bool> camelMatch(vector<string>& queries, string pattern) {
Node* head = new Node();
insertNode(head, pattern);
vector<bool> ans(queries.size());
for (int i = 0; i < queries.size(); i++) {
Node* curr = head;
bool ok = true;
for (char c : queries[i]) {
if (curr->child.count(c)) curr = curr->child[c];
else if (c >= 'A' && c <= 'Z') { ok = false; break; }
}
ans[i] = curr->isEnd && ok;
}
return ans;
}
};
int main() {
vector<string> v1 = {"FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"};
Solution ob;
for (bool b : ob.camelMatch(v1, "FB")) cout << b << ", ";
}
Input
["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"] "FB"
Output
[1, 0, 1, 1, 0, ]