比较不包括标点符号和空格的字符串
Posted
技术标签:
【中文标题】比较不包括标点符号和空格的字符串【英文标题】:Comparing strings excluding punctuation and whitespace 【发布时间】:2012-04-26 08:16:04 【问题描述】:我正在编写一个程序来查找 C++ 中的大回文,我需要获取输入字符串的回文忽略大小写、标点符号和空格。例如,请参见以下行:
孔子说:夫人,我是亚当。
这里,如果忽略大小写、标点符号和空格,最大的回文是 女士,我是亚当。
该程序还必须高效,以便在
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 作为最大回文数。
问题:
如何将此字符串转换回原来的样子(标点符号、空格和大小写)?
或
如何直接在方法largestPal
中测试剥离的字符串,但返回对应于所选最大回文的原始字符串(未剥离的)?
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:最简单的方法是制作一个表格,将剥离字符串中的字符映射到它们在未剥离字符串中的原始位置。
例如,如果输入是“a V, v”,那么您剥离的字符串将是“avv”。你的地图将是 1,3,6。这表明剥离字符串中的第一个字符是未剥离字符串的第一个,接下来是第三个,接下来是第六个。剥离字符串时制作此地图。
当你得到最终输出时,在剥离的字符串中找到它。在原始字符串中查找剥离字符串中第一个和最后一个字符的索引,然后输出该范围的字符。
所以对于“avv”1、3、6,您的剥离输出将是“vv”。你在 "avv" 中找到 "vv" 并查找相应的索引并得到 3,6 -- 所以你想输出原始字符串中包含 3-6 的字符,或者 "V, v"。
【讨论】:
感谢您的回答!这种方法很容易实现,但是性能呢? (记住:2000 个字符的字符串必须在 它应该对性能几乎没有影响,因为它根本不会改变您对最长回文的搜索。你仍然得到相同的剥离字符串,你仍然只需要在剥离字符串中产生最长的回文。 有什么简单的方法可以用来在剥离字符串中查找返回字符串的索引吗? (例如:avv 中 vv 的索引)【参考方案2】:有两种策略:
使用未修改的字符串,使用切片系统和特定的比较器 使用规范版本查找回文,但要记住它们来自哪里鉴于您选择了第二种策略,剩下的就是记住您在原始字符串中的位置。如果你记住了回文首字母的索引,那么你可以只计算字母来检索原始字符串中的回文。
【讨论】:
【参考方案3】:搜索回文时必须存储字符位置。所以返回值应该是位置对,而不是字符串。
然后以与剥离字符串时类似的方式处理原始字符串。跳过空格和标点符号,计算字母以找到开始和结束位置。
【讨论】:
以上是关于比较不包括标点符号和空格的字符串的主要内容,如果未能解决你的问题,请参考以下文章