【牛客网】统计回文
本题链接
题目描述
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
- 在A的第一个字母之前: “baba” 不是回文
- 在第一个字母‘a’之后: “abba” 是回文
- 在字母‘b’之后: “abba” 是回文
- 在第二个字母’a’之后 “abab” 不是回文
所以满足条件的答案为2
输入描述:
每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母
输出描述:
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
示例1
输入
aba
b
输出
2
【题目解析】
本题叙述较长,首先以后面对这种题目描述比较长的题,不要害怕,它里面的大部分描述都只是为题做铺垫,所以读题时抓住重点。
什么是回文字符串,题目里面说就是一个正读和反读都一样的字符串 ,回文串也就是前后对称的字符串。本题是判断是否是回文串的变形题。字符串本身不一定是回文,把第二个字符串插入进去看是否是回文。【解题思路】
整体思路
1.首先这是一个回文函数类型的变形题,将字符串str2
插入到字符串str1
里,先要判断是否是回文字符串,所以我们应该先编写一个判断回文的函数。
2.通过count
来统计插入到不同位置后出现回文的次数。
具体操作:
1.回文函数编写:通过首尾指针来解决,所对应的值相等,然后向中靠拢(++begin,--end
),若有一个值不相等则直接return false
,循环判断完成后return true
。
2.主函数
①定义三个字符串,第一个字符串被插入(字符串会改变),第二个字符串插入,第三个字符串来保存第一个字符串没被插之前的值。
②要插入到第一个字符串的每个位置上,所以要循环遍历,使用任意位置插入的库函数insert
,然后调用回文函数判断是否回文,满足则count++
。
【代码实现】
#include<iostream>
#include<string>
using namespace std;
bool Palindrome(string str)
{
auto begin = 0;
auto end = str.size() - 1;
while(begin <= end)
{
if(str[begin] != str[end])
{
return false;
}
begin++;
end--;
}
return true;
}
int main()
{
string str1;
string str2;
string s;
getline(cin,str1);
getline(cin,str2);
int count = 0;
for(int i = 0;i <= str1.size();i++)
{
s = str1;
str1.insert(i,str2);
if(Palindrome(str1))
{
count++;
}
str1 = s;
}
cout<<count<<endl;
return 0;
}
代码遇到的问题:
在进行循环位置插入的时候,for(int i = 0;i <= str1.size();i++)
不加'=
行吗?
不行,起初不加会出现这种现象
这是因为如果去掉等号,则代码无法进行尾插,相当于少判断了一个位置,导致测试用例不能完全通过。
总结:
1.对代码逻辑的考察
2.对于c++库函数insert
的考察