Дана строка S. Выведите лексикографически наименьшую возможную строку. Вы можете внести минимальные изменения в символы в строке и переставить строку. Примеры:
void makeSmallestPalindrome(string s) { int n = s.size(); unordered_map<char, int> mp; int oddnums = 0; for (auto i: s) mp[i]++; for (char i = 'a'; i <= 'z'; i++) { if(mp[i]%2)oddnums++; } //update count to make only one odd character exists if (oddnums > 1) { for (char i = 'a'; i <= 'z'; i++) { // cout << mp[i] << " " << i << " " << oddnums << endl; if (mp[i] && mp[i]%2) { if (oddnums > 1) { mp[i]++; oddnums-=2; } else if (oddnums == 1) oddnums--; else mp[i]--; } } } string f, m, s2; f = m = s = ""; for (char i = 'a'; i <= 'z'; i++) { if (mp[i]) { if (mp[i]%2) m = i; f += i*(mp[i]/2); } } s2 = f; reverse(s2.begin(), s2.end()); cout<< f+m+s2; } int main() { string s = "aabcd"; // s = "aabc"; makeSmallestPalindrome(s); } /** cnt all the characters */