一,题目描述
“回文串”是一个正读和反读都一样的字符串,比如“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.看到这个问题,首先,我能想到的就是创建两个字符串,然后将这两个字符串的字符输入进去。
2.然后将str2的字符插入到字符str1中的位置进行遍历,但是有因为,如果插入到str1中,那么每次str1是开始值就变化了,所以我们就创建一个新的str,将str1给str,每次拿str,进行比较,到插入新的位置的时候,重新将str1给str。
3. 判断回文,将一个新的字符串进入回文,然后,拿出字符串的开始begin,结尾end,然后将头和尾进行比较是否相等,如果不相等,那么进行++和–,在进行比较,到最后相等,输出count个数。
三,程序代码
#include<iostream>
#include<string>
using namespace std;
//判断回文
bool IsCrival(const string& s)
{
size_t begin = 0;
size_t end = s.size() - 1;
while (begin < end)
{
//如果开始和结尾不同,返回false
if (s[begin] != s[end])
return false;
//否则begin++,end--
begin++;
end--;
}
return true;
}
int main()
{
//首先创建两个字符串str1,str2;
string str1, str2;
//输入两个字符串
getline(cin, str1);
getline(cin, str2);
size_t count = 0;
for (size_t i = 0; i <= str1.size();i++)
{
//将str2插入到str不同的位置
string str = str1;
str.insert(i, str2);
//判断是否回文
if (IsCrival(str))
count++;
}
cout << count << endl;
return 0;
}
四,程序运行结果

如果,感觉博主写的可以的话,那么关注一个再走么!!!
本文探讨了一种算法,该算法旨在找出将字符串B插入到字符串A中的所有可能位置,以形成回文串。通过遍历和插入操作,结合回文串的特性,程序能够计算并返回满足条件的方法总数。

3469

被折叠的 条评论
为什么被折叠?



