Mô tả bài toán
Cho chuỗi S (không có ký tự trùng) định nghĩa thứ tự tùy chỉnh, và chuỗi T. Sắp xếp lại T sao cho thứ tự các ký tự xuất hiện trong S được giữ nguyên. Ký tự không có trong S đặt vị trí bất kỳ.
Ví dụ: S="cba", T="abcd" → "cbad" (c,b,a theo S, d tự do).
Giải thuật Đếm tần suất
- Đếm tần suất mỗi ký tự trong
T. - Duyệt
S: thêm ký tự vào kết quả đúng số lần xuất hiện, đặt count = 0. - Duyệt các ký tự còn lại (count > 0): thêm vào kết quả.
Cài đặt C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string customSortString(string S, string T) {
vector<int> cnt(26, 0);
for (char c : T) cnt[c - 'a']++;
string res;
for (char c : S) {
res.append(cnt[c - 'a'], c);
cnt[c - 'a'] = 0;
}
for (int i = 0; i < 26; i++) {
if (cnt[i] > 0) res.append(cnt[i], 'a' + i);
}
return res;
}
};
int main() {
Solution ob;
cout << ob.customSortString("cba", "abcd"); // cbad
return 0;
}
Độ phức tạp
- Thời gian:
O(|S| + |T|). - Không gian:
O(1)(mảng 26 phần tử).