Учитывая строку, мне нужно найти самый длинный палиндром, который можно построить, удалив или перетасовав символы из строки. Если существует более одного палиндрома одинаковой длины, мне нужно убедиться, что лексикографически наименьший из них указан в качестве выходного.
Пример: "adskassda" Ожидаемый результат: "adsasda"
Я могу найти самый большой палиндром, но как обеспечить, чтобы в случае кратных одной и той же максимальной длины лексикографически наименьший был выдан в качестве выхода?
Любую палиндромную струну можно разделить на три части - начальная, средняя и конечная. Для палиндромной строки нечетной длины, скажем, 2n + 1, «beg» состоит из первых n символов строки, «mid» будет состоять только из 1 символа, т.е. (n + 1) -й символ, а «end» будет состоять из последних n символов палиндромной струны. Для палиндромной струны четной длины 2n 'mid' всегда будет пустым. Следует отметить, что «конец» будет обратным «умолять», чтобы строка была палиндромом.
Я тоже использовал ту же логику для этого.
#include <bits/stdc++.h>
using namespace std;
string longestPalindrome(string str){
map<char,int> frequencyChar;
for(int i=0;i<str.length();i++){
frequencyChar[str[i]]++;
}
char middle_character;
string leftStr;
for(auto it: frequencyChar){
char currentChar=it.first;
int frequencyCurrentChr = it.second;
if(frequencyCurrentChr%2!=0){
middle_character=currentChar;
}
leftStr.append(frequencyCurrentChr/2,currentChar);
}
string rightStr(leftStr.rbegin(),leftStr.rend());
return leftStr + middle_character + rightStr;
}
int main() {
string str = "adskassda";
cout<<longestPalindrome(str);
}
Я получаю "adsssda", но ожидается "adsasda"