计算句子中回文的数量
Counting the Number of Palindromes in a Sentence
大家好!下面是一个程序,它要求用户输入一个句子,并输出其中的回文数
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
bool isPalindrome (const std::string& s) {
for (int i = 0; i < (s.length())/2; ++i) {
if (s[i] != s[s.length()-1 - i])
return false;
else
return true;
}
}
int main() {
string sentence;
int counter=0;
cout << "Please input a sentence." << endl;
getline(cin, sentence);
stringstream processtokens(sentence);
for(string word; processtokens >> word;)
if(isPalindrome(word))
++counter;
cout << "Number of Palindromes are : " << counter << endl;
}
它工作得很好。但例如,当我输入"快速棕色插科打诨有一只蓝眼睛"时,程序显示的回文数只有1个,但实际上,这个句子有两个回文:插科打骂和眼睛。问题是"眼睛"这个词有一个句号。那么,当用户输入"我喜欢中午、晚上和午夜"时,程序怎么能忽略句点和逗号等标点符号呢。正午是一个回文,但由于逗号的原因,程序无法识别它。
另一个问题是资本化。当用户输入"夫人,我的工作完成了"时,我希望这个程序能够工作(并忽略ASCII等价物)。我知道这与tolower有关。
总之,我希望这个程序有一个函数,a)忽略标点符号和b)大写。
哦,"字符串流处理标记(句子);…"的替代方案是什么?相反,我需要这个程序使用子字符串(substr)并查找。
请引导我,伙计们!谢谢你,我们非常感谢你的帮助。再次感谢,祝你今天愉快!
您可以使用ispunct并忽略ispunct返回true的任何字符。您还应该在调用tolower()
也许这个小练习可以用来介绍一些不错的C++功能,比如迭代器:
inline bool is_letter(char c)
{ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); }
bool is_palindrome(const std::string & s)
{
std::string::const_iterator it = s.begin();
std::string::const_reverse_iterator rt = s.rbegin();
while (it != s.end() && rt != s.rend() && std::distance(it, rt.base()) > 0)
{
// Skip non-letters
while (it != s.end() && !is_letter(*it)) { ++it; }
while (rt != s.rend() && !is_letter(*rt)) { ++rt; }
if (it == s.end() || rt == s.rend()) { break; }
// Check palindromy
if (std::tolower(*it) != std::tolower(*rt)) { return false; }
// Move on
++it;
++rt;
}
return true;
}
诀窍是从两端攻击绳子。为此,我们有一个普通迭代器it
,来自字符串的开头,还有一个反向迭代器,rt
,来自字符串末尾。
代码的核心是检查回文(不区分大小写,通过比较向下的字符),以及即使失败也要立即检查return false
;否则,这两个迭代器将前进一步。
最后,循环的开头会吞噬字符串中的非字母字符,因此这些字符会被完全忽略。我们再次检查我们是否在狼吞虎咽之后到达了绳子的末端;您必须确保仅将迭代器取消引用到有效元素!
当向前移动的迭代器超过向后移动的迭代器时,循环停止。这是条件distance(it, rt.base()) > 0
的内容:反向迭代器的"基"实际上是反向迭代者的元素之后的元素的普通迭代器。因此,只要it
到rt
的基部的距离严格大于零,it
就没有越过rt
。(当it
和rt
涉及同一元素时,距离正好为1。)
我认为有一个函数可以检查标点符号。您可能想要尝试ispunct
- C++:正在检查LinkedList中的回文-递归方法-错误
- Usaco第1.6节主要回文
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 将 S1 转换为回文,并将 S2 作为其子字符串
- 数回文词
- 最长的回文子串(C++帮助)
- 有人可以详细解释这个回文代码是如何工作的吗?
- 回文递归版本
- 如何检查C ++ STL列表是否为回文?
- 回文数在 1 到 10000 之间
- C++ - 检查结构数据类型中的单词是否为回文
- 是回文作业练习
- 回文递归不停止
- 整数数组中最长的回文
- 回文测试
- 最大的回文产品(Project Euler)——C++
- C++ 回文程序总是给出 0(假)作为输出问题;我的代码哪里有问题?
- 递归回文问题的时间复杂度,C++
- 程序以查找给定字符串中回文的子字符串的数量
- 计算句子中回文的数量