Mọi người giải thích thuật toán của mình ra luôn được không? Vì bài này mình cho phép dùng mọi ngôn ngữ, nên tốt nhất là nói luôn giải thuật để người khác đọc vào hiểu được.
P/S: Đạt không nghĩ là bài này lại có nhiều giải pháp overkill như vậy.
P/S2: Đạt giải bài này dùng cách tương tự như @nguyenhuuca, dùng unordered_map
Bước 1: Tách từng từ trong chuỗi ra
Bước 2: Dùng mỗi từ là key trong unordered_map, value là count của từ đó. Với cách này mình sẽ có O(n)
Bước 3: Chuyển cái kết quả từ map sang vector, sort lại. Với bước này mình sẽ tốn O(mlogm) với m là số lượng từ đã sắp xếp trong câu. m <= n.
Tổng phức tạp của bài này là O(n + mlogm), giả sử m << n thì coi như O(n)
Space complexity: O(m), với m là số lượng từ trong trong kết quả
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
vector<pair<string, int>> solution(string inputStr) {
string word;
unordered_map<string, int> map;
for(char c : inputStr) {
if(isspace(c)) {
if (!word.empty()) {
map[word]++;
word.clear();
}
} else if (isalnum(c)){
word.push_back(tolower(c));
}
}
map[word]++;
vector<pair<string, int>> ans;
for(auto p : map) {
ans.push_back(make_pair(p.first, p.second));
}
sort(ans.begin(), ans.end(), [](const std::pair<string,int> &left, const std::pair<string,int> &right){
return left.second > right.second;
});
return ans;
}
int main() {
vector<pair<string, int>> ans = solution("day nhau hoc. hoc nhau day. ?? ^_^ HOC hoc day day. day MA khong hoc.");
for(auto e : ans) {
cout << e.first << " : " << e.second << endl;
}
}