Cho chuỗi croakOfFrogs là trộn lẫn các từ "croak" của nhiều ếch (mỗi ếch kêu lần lượt c-r-o-a-k). Tìm số ếch tối thiểu. Nếu chuỗi không hợp lệ → -1.
Ví dụ
Đầu vào: "crcoakroak"
Đầu ra: 2.
Thuật toán đếm trạng thái
- Duy trì đếm từng ký tự
c,r,o,a,ktrong map. - Duyệt chuỗi: tăng đếm ký tự hiện tại.
- Kiểm tra tính hợp lệ: tại mọi thời điểm, đếm('c') ≥ đếm('r') ≥ ... ≥ đếm('k'). Nếu vi phạm → -1.
- Khi gặp 'c': ếch mới bắt đầu kêu →
active++. - Khi gặp 'k': ếch kết thúc →
active--. - Theo dõi
max(active)→ số ếch cùng kêu lúc nào nhiều nhất = kết quả. - Cuối cùng: kiểm tra tất cả đếm bằng nhau (mỗi ếch kêu đủ 5 ký tự).
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minNumberOfFrogs(string s) {
unordered_map cnt;
string order = "croak";
int active = 0, ans = 0;
for (char c : s) {
cnt[c]++;
for (int i = 0; i < 5; ++i) {
if (cnt[order[i]] < (i?cnt[order[i-1]]:0)) return -1;
}
if (c == 'c') ans = max(ans, ++active);
else if (c == 'k') --active;
}
for (int i = 1; i < 5; ++i)
if (cnt[order[i]] != cnt[order[0]]) return -1;
return ans;
}
};
Độ phức tạp
- Thời gian: O(N) - duyệt chuỗi một lần.
- Không gian: O(1) - map kích thước cố định 5.
Kết quả kiểm thử
Đầu vào: "crcoakroak"
Đầu ra: 2