Cho số N (dạng chuỗi) và mảng thay thế 10 chữ số alt[0..9] cho các chữ số 0-9. Nhiệm vụ: thay thế một đoạn liên tiếp duy nhất của N bằng các chữ số thay thế tương ứng để số kết quả lớn nhất.
Ví dụ 1
Input
N = "1234", alt[] = {3,0,1,5,7,7,8,2,9,4}
Output – "1257"
Giải thích: Thay đoạn "34" → "57" (alt[3]=5, alt[4]=7). Số trở thành 1257.
Ví dụ 2
Input
N = "5183", alt[] = {3,0,1,5,7,7,8,2,9,4}
Output – "7183"
Giải thích: Thay chữ số đầu '5' → '7' (alt[5]=7). Dừng vì alt[1]=0 < 1.
Thuật toán tham lam
- Duyệt chuỗi từ trái sang phải.
- Tìm vị trí đầu tiên có alt[digit] > digit.
- Từ vị trí đó, tiếp tục thay thế cho đến khi gặp chữ số có alt[digit] < digit.
- Dừng và trả về kết quả.
Ví dụ code
#include <bits/stdc++.h>
using namespace std;
string maximizeNumber(string str, int alt[]) {
int n = str.size();
for (int i = 0; i < n; i++) {
int digit = str[i] - '0';
if (digit < alt[digit]) {
// Bắt đầu thay thế từ i
int j = i;
while (j < n && (str[j] - '0') <= alt[str[j] - '0']) {
str[j] = '0' + alt[str[j] - '0'];
j++;
}
return str; // Chỉ thay 1 đoạn liên tiếp
}
}
return str; // Không thay đổi
}
int main() {
string str = "2075";
int alt[] = {3, 0, 1, 5, 7, 7, 8, 2, 9, 4};
cout << maximizeNumber(str, alt) << endl;
return 0;
}
Kết quả
2375
Giải thích: str="2075". i=0: '2', alt[2]=1 < 2 → bỏ qua. i=1: '0', alt[0]=3 > 0 → bắt đầu thay. - j=1: '0'→'3' (alt[0]=3 ≥ 0) - j=2: '7', alt[7]=2 < 7 → dừng. Kết quả: "2375".
Độ phức tạp: O(N) - duyệt chuỗi một lần.