我正在编写一个程序来查找C ++中的大回文,我需要得到输入字符串忽略大小写,标点符号和空格的回文。例如,请参阅以下行:
Confusius说:女士,我是亚当。
在这里,最大的回文是 Madam,我是亚当,如果你忽略大小写,标点符号和空格。
该程序还必须高效,以便在<中测试具有2000个字符的字符串。 1秒。所以我有以下代码返回最大的回文:
string largestPal(string input_str) {
string isPal = "";
string largest = "";
int j, k;
for(int i = 0; i < (input_str.length() - 1); ++i) {
k = i + 1;
j = i - 1;
if(j >= 0 && k < (input_str.length())) {
if(input_str[i] == input_str[j])
j--;
else if(input_str[i] == input_str[j])
k++;
}
while(j >= 0 && k < (input_str.length())) {
if(input_str[j] != input_str[k])
break;
else {
j--;
k++;
}
isPal = input_str.substr(j + 1, k - j - 1);
if(isPal.length() > largest.length()) {
largest = isPal;
}
}
}
return largest;
}
我尝试输入一个完全格式化的字符串(没有空格,标点符号和大小写)作为此方法的参数,并成功获得了我想要的输出。 (例如,前面的示例将 MADAMIMADAM 作为最大的回文返回。
问题:
如何将此字符串转换回原样(带标点符号,空格和大小写)?
OR
如何直接在方法largestPal
内测试剥离的字符串,但是返回与所选择的最大回文对应的原始字符串(unstrippped)?
任何帮助都非常感谢!
答案 0 :(得分:2)
有两种策略:
鉴于您选择了第二个策略,剩下的就是记住原始字符串中的位置。如果你记住回文的第一个字母的索引,那么你可以只计算字母来检索原始字符串中的回文。
答案 1 :(得分:1)
最简单的方法是创建一个表,将已剥离字符串中的字符映射到未提取字符串中的原始位置。
因此,例如,如果输入为“a V,v”,则剥离的字符串将为“avv”。你的地图将是1,3,6。这表明剥离字符串中的第一个字符是未剥离的第一个字符,下一个是第三个字符,下一个是第六个字符。剥离字符串时制作此地图。
当你有最终输出时,在剥离的字符串中找到它。在原始字符串中查找剥离字符串中第一个和最后一个字符的索引,然后输出该字符范围。
因此,对于“avv”1,3,6,您的剥离输出将为“vv”。您在“avv”中找到“vv”并查找相应的索引并获得3,6 - 因此您希望在原始字符串中输出字符3-6,或“V,v”。
答案 2 :(得分:0)
搜索回文时必须存储角色位置。因此,返回值应该是位置对,而不是字符串。
然后以与剥离字符串时类似的方式处理原始字符串。跳过空格和点状,并计算字母以找到起始位置和结束位置。