比较不包括标点和空格的字符串 我正在编写一个程序,在C++中找到大回文,并且需要输入的字符串回文。例如,请参见以下行:

比较不包括标点和空格的字符串 我正在编写一个程序,在C++中找到大回文,并且需要输入的字符串回文。例如,请参见以下行:,c++,algorithm,palindrome,C++,Algorithm,Palindrome,孔子说:夫人,我是亚当 在这里,最大的回文是Madam,如果你忽略大小写、标点符号和空格,我就是Adam 该程序还必须高效,以便在

孔子说:夫人,我是亚当

在这里,最大的回文是Madam,如果你忽略大小写、标点符号和空格,我就是Adam

该程序还必须高效,以便在<1秒的时间内测试2000个字符的字符串。因此,我有以下返回最大回文的代码:

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;
}
string largestPal(字符串输入){
字符串isPal=“”;
字符串最大=”;
int j,k;
对于(int i=0;i<(input_str.length()-1);+i){
k=i+1;
j=i-1;
如果(j>=0&&k<(输入长度()){
如果(输入\u str[i]==输入\u str[j])
j--;
else if(input_str[i]==input_str[j])
k++;
}
而(j>=0&&k<(input_str.length()){
如果(输入符号[j]!=输入符号[k])
打破
否则{
j--;
k++;
}
isPal=输入子序列(j+1,k-j-1);
if(isPal.length()>最大.length()){
最大值=isPal;
}
}
}
回报最大;
}
我尝试输入一个完全格式化的字符串(没有空格、标点符号和大小写)作为这个方法的参数,并成功地获得了我想要的输出。(例如,前面的示例返回MADAMIMADAM作为最大回文

问题:

如何将此字符串转换回原来的状态(使用标点、空格和大小写)

如何在方法
largestPal
中直接测试剥离字符串,但返回与所选最大回文相对应的原始字符串(未剥离)


非常感谢您的帮助!

最简单的方法是制作一个表格,将剥离字符串中的字符映射到其在非剥离字符串中的原始位置

例如,如果输入为“a V,V”,则剥离字符串将为“avv”。映射将为1,3,6。这表示剥离字符串中的第一个字符是未剥离字符串中的第一个,下一个是第三个,下一个是第六个。在剥离字符串时制作此映射

获得最终输出后,在剥离字符串中找到它。在原始字符串的索引中查找剥离字符串中的第一个和最后一个字符,然后输出该范围的字符


因此,对于“avv”1,3,6,您的剥离输出将是“vv”。您在“avv”中找到“vv”,并查找相应的索引,得到3,6——因此您希望输出原始字符串中包含的字符3-6,或“V,V”.

最简单的方法是制作一个表,将剥离字符串中的字符映射到其在非剥离字符串中的原始位置

例如,如果输入为“a V,V”,则剥离字符串将为“avv”。映射将为1,3,6。这表示剥离字符串中的第一个字符是未剥离字符串中的第一个,下一个是第三个,下一个是第六个。在剥离字符串时制作此映射

获得最终输出后,在剥离字符串中找到它。在原始字符串的索引中查找剥离字符串中的第一个和最后一个字符,然后输出该范围的字符


因此,对于“avv”1,3,6,您的剥离输出将是“vv”。您在“avv”中找到“vv”,并查找相应的索引,得到3,6——因此您希望输出原始字符串中包含的字符3-6,或“V,V”.

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


然后,只需像剥离字符串时那样处理原始字符串。跳过空格和点字,然后计数字母以找到起始和结束位置。

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


然后,只需像剥离字符串时那样处理原始字符串。跳过空格和点字,然后数一数字母以找到起始和结束位置。

有两种策略:

  • 使用一个切片系统和一个特定的比较器来播放未修改的字符串
  • 使用规范版本查找回文,但记住它们来自何处

如果您选择了第二种策略,那么剩下的就是记住您在原始字符串中的位置。如果您记住了回文的第一个字母的索引,那么您可以只计算字母数来检索原始字符串中的回文。

有两种策略:

  • 使用一个切片系统和一个特定的比较器来播放未修改的字符串
  • 使用规范版本查找回文,但记住它们来自何处

考虑到您选择了第二种策略,剩下的就是记住您在原始字符串中的位置。如果您记住回文的第一个字母的索引,那么您只需数数字母即可检索原始字符串中的回文。

谢谢您的回答!此方法很容易实现,但性能如何曼斯?(请记住:必须在其中处理2000个字符的字符串应该对性能几乎没有影响,因为它根本不会改变您对最长回文的搜索。您仍然会得到相同的剥离字符串,并且您仍然只需要在剥离字符串中生成最长的回文。有什么简单的方法可以用来查找索引吗在剥离字符串中返回字符串的索引?(例如:avv中vv的索引)感谢您的回答!此方法