比较不包括标点符号和空格的字符串

时间:2012-04-26 08:16:05

标签: c++ algorithm palindrome

我正在编写一个程序来查找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)?

任何帮助都非常感谢!

3 个答案:

答案 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)

搜索回文时必须存储角色位置。因此,返回值应该是位置对,而不是字符串。

然后以与剥离字符串时类似的方式处理原始字符串。跳过空格和点状,并计算字母以找到起始位置和结束位置。