这一天,lhy同学做了一个梦,梦见嘉然对自己说:我喜欢编程厉害的男生!只有编程厉害的男生我才会考虑,现在我要考考你。
现在我给你一个长度不超过1200的字符串,你需要帮我找到所有的长度大于等于2的回文子串,什么是回文子串呢?
回文子串就是从左向右看和从右向左看一样的在字符串中连续的子串。我想你可能听不明白。
那我举个例子吧!
比如abcbaw
那么abcba就是其中的一个回文子串,同样的bcb也是长度大于等于2的回文子串。
那么这些回文子串,每一个子串占一行,而且一定要优先输出长度较小的,如果长度相等的话,那么我们就先输出出现位置靠左的。
lhy突然从梦中被惊醒,作为班上的学习委员,他一定要做出这道题,但是他最近状态萎靡,为了让他在梦中得到女神的青睐,请问你能帮助他吗?
输入描述:
一个字符串s
字符串仅由数字,空格,英文字母构成
输出描述:
请按照嘉然的要求,输出全部的回文子串,好心的嘉然提醒一下大家:输入的字符串中可能会有空格哦!
同时注意行末不要有多余的换行符!
示例1
输入
12321
输出
232
12321
示例2
输入
123asdasddsadsa321
输出
dd
sdds
asddsa
dasddsad
sdasddsads
asdasddsadsa
3asdasddsadsa3
23asdasddsadsa32
123asdasddsadsa321
示例3
输入
12 21
输出
2 2
12 21
说明
空格视为与数字,英文字母等价的正常字符
收获:
1、优先输出长度小的+靠左的用 j - i ~
2、可用双指针来判断一个字符串是否是回文~
3、双循环判断所有字符串
#include <bits/stdc++.h>
using namespace std;
char s[1205];
bool ck(int l, int r) // 模板
{
while (r > l)
{
if (s[l] != s[r])
return 0;
r--;
l++;
}
return 1;
}
int main()
{
string ss;
getline(cin, ss);
int len = ss.length();
for (int i = 1; i <= len; i++) //也算个模板
{
s[i] = ss[i - 1];
}
for (int i = 1; i <= len; i++) //算个模板遍历所有字符串子
{
for (int j = i + 1; j <= len; j++)
{
if (ck(j-i, j))
{
for (int k = j-i; k <= j; k++)
{
cout << s[k];
}
cout << endl;
}
}
}
}