Cho số N (chuỗi). Hoán vị 1 cặp chữ số để được số lớn nhất có thể nhưng vẫn nhỏ hơn N.
Ví dụ
N=54624 → Hoán vị 6 (vị trí 2) và 4 (vị trí 4) → 54426
Thuật toán
- Từ phải sang trái, tìm
iđầu tiên sao chos[i] > s[i+1](điểm giảm). - Từ phải sang trái, tìm
jlớn nhất sao chos[j] < s[i](vàs[j]lớn nhất có thể). - Hoán vị
s[i]vàs[j]. - Nếu không tìm thấy
i→ trả về -1.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
string largestSmallerOneSwap(string s) {
int n = s.size();
int i = n - 2;
while (i >= 0 && s[i] <= s[i+1]) i--;
if (i < 0) return "-1";
int j = n - 1;
while (s[j] >= s[i] || (j > i+1 && s[j] == s[j-1])) j--;
swap(s[i], s[j]);
return s;
}
int main() {
cout << largestSmallerOneSwap("54624") << endl; // 54426
return 0;
}
Kết quả
54426