Cho chuỗi S và từ điển words. Đếm số từ trong words là chuỗi con (subsequence) của S.
Ví dụ: S = "abcde", words = ["a","bb","acd","ace"] → 3 ("a", "acd", "ace").
Thuật toán giải quyết (Bucket theo ký tự đầu + Duyệt S)
- Nhóm các từ trong
wordstheo ký tự đầu tiên vào mapm[char] = list. - Duyệt từng ký tự
ctrongS:- Lấy danh sách
temp = m[c], xóam[c]. - Với mỗi từ trong
temp:- Nếu độ dài = 1 → tăng kết quả.
- Ngược lại → bỏ ký tự đầu, thêm phần còn lại vào
m[next_char].
- Lấy danh sách
- Trả về kết quả.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numMatchingSubseq(string S, vector<string>& words) {
unordered_map<char, vector<string>> m;
for (string &w : words) m[w[0]].push_back(w);
int ans = 0;
for (char c : S) {
auto it = m.find(c);
if (it == m.end()) continue;
vector<string> temp = move(it->second);
m.erase(it);
for (string &w : temp) {
if (w.size() == 1) ans++;
else m[w[1]].push_back(w.substr(1));
}
}
return ans;
}
};
int main() {
string s = "abcde";
vector<string> v = {"a", "bb", "acd", "ace"};
Solution ob;
cout << ob.numMatchingSubseq(s, v);
}
Đầu vào
"abcde" ["a","bb","acd","ace"]
Đầu ra
3