【发布时间】:2019-11-06 09:37:38
【问题描述】:
给定一个字符串,我需要找到可以通过从字符串中删除或改组字符来构造的最长回文。如果存在多个相同长度的回文,那么我需要确保以字典顺序最小的回文作为输出。 示例:“adskassda” 预期输出为:“adsasda”
我能够找到最大的回文,但是如何确保在多个相同的最大长度的情况下,按字典顺序最小的一个作为输出?
任何回文字符串都可以分为三个部分——beg、mid和end。对于奇数长度的回文字符串,比如 2n + 1,“beg”由字符串的前 n 个字符组成,“mid”将仅包含 1 个字符,即第 (n + 1) 个字符,“end”将由最后 n 个字符组成的回文字符串。对于偶数长度为 2n 的回文字符串,“mid”将始终为空。应该注意的是,“end”将与“beg”相反,以使字符串成为回文。 我也使用了相同的逻辑。
#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”
【问题讨论】:
-
当您确定
middle_character时,您可以/应该将std::min()应用于之前的候选人和新候选人。此外,您应该初始化middle_character(例如'\0')以识别是否已经有候选人。如果找不到候选字(即所有字符的频率相同),这也很有用。 -
@Scheff 找到带有中间字符的最小值可能不适用于当前的代码方法。请参阅此参考:ideone.com/sCCdcm
-
确实如此:Live Demo on coliru。 ;-)
-
只是对风格的评论,除非您正在开发 libstdc++,否则您不应在
bits子目录中包含<bits/stdc++.h>或其他任何内容。这些是库实现使用的内部文件,请改用标准定义的包含文件。 -
请注意,我用 127 初始化了
middle_char,以消除在min()之前进行额外检查的需要。您没有进行额外检查,因此您最终将始终得到middle_char== 0。在return之前,还需要检查以插入(或不插入)middle_char,前提是它不再存在初始化。价值。
标签: c++ algorithm palindrome