题目描述
最近,xca在研究回文字符串的问题,发现一题很有意思,题目这样说的:有一行以”*”结尾的字符串。该字符串中包括若个单词。单词之间由空格隔开,请求出这段字符串中所包含的回文字符串(不一定全是字母,还可以有别的符号),输出这些回文字符串,中间用空格隔开。
输入形式
一行以*结尾的字符串(标点符号只包含.和?)。
输出形式
字符串中包含的回文字符串, 标点符号不算单词。
输入样例
I am a Student AAA.XCA? Are you a WCW?*
输出样例
I a AAA a WCW
算法
解题思路
① 输入整行的字符串
② 遍历字符串,设置保存单词的数组,以空格、“.”、“?”、“”为区别界限,提炼每一个单词
③ 判断单词是否为回文字符串
④ 更新下一个单词的起始位置x
⑤ 考虑开头空格问题和单词之间多空格问题
⑥ 考虑特殊测试用例:I am .ACA AAA cc*(输出应该为:I ACA )
C++ 代码
#include <iostream>
using namespace std;
int main(){
string s;
getline(cin, s);
int x = 0, y = 0;
for (int i = 0; i < s.size(); i ++){
string res;
if(s[i] == ' ' || s[i] == '?' || s[i] == '.' || s[i] == '*'){
y = i - 1;
res = s.substr(x, y - x + 1);
bool is_same = true;
for (int j = 0; j < res.size() / 2; j ++)
if(res[j] != res[res.size() - 1 - j]) is_same = false;
if (res.size() == 0 || res[0] == '?' || res[0] == '.') is_same = false;
if (is_same)
cout << res << ' ';
x = y + 2;
if (s[i] == '*') break;
}
}
return 0;
}
$QWQ如果有更好写好, 欢迎评论区留言,orz$