题目链接
题目描述与示例
“回文串”是一个正读和反读都一样的字符串,比如“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之后构成一个回文串的方法数
示例
输入:
aba b
输出:
2
解题思路
题目分析
这个题目描述的还是比较详细了,就是将第二个字符串依次插入到第一个字符串中,再判断新的字符串是否为回文结构,然后输出有几种插入方式为回文
个人思路
- 定义临时对象tmp保存第一个字符串
- 依次向临时变量中插入第二个字符串
- 判断是否回文,是则count++
判断回文结构的方法:
- 类似双指针思想,一个begin从前往后,end从后往前,判断字符是否相等
- 定义临时变量保存需要判断字符串的逆置形式,如果逆置后与原字符串相等则为回文结构。
代码展示
#include<iostream>
#include<string>
using namespace std;
bool IsPalindromeStr(const string &s)
{
size_t begin=0,rbegin=s.size()-1;
while(begin < rbegin)
{
if(s[begin] != s[rbegin])
return false;
begin++;
rbegin--;
}
return true;
}
int main()
{
string s1,s2;
//最好还是用getline防止输入的串中有空格
cin>>s1>>s2;
int count=0;
for(size_t i=0;i <= s1.size();i++)
{
//拷贝s1保持s1不动,插入操作都在临时对象中进行
string tmp(s1);
tmp.insert(i,s2);
if(IsPalindromeStr(tmp)==true)
count++;
}
cout<<count;
return 0;
}
题解
看了许多题解(C/C++)感觉大致上都和上述的差不多,所以这里就给一个用逆置判断回文的代码吧:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string s1,s2;
//最好还是用getline防止输入的串中有空格
cin>>s1>>s2;
int count=0;
for(size_t i=0;i <= s1.size();i++)
{
//拷贝s1保持s1不动,插入操作都在临时对象中进行
string tmp(s1);
tmp.insert(i,s2);
string tmp2=tmp;
reverse(tmp2.begin(),tmp2.end());
if(tmp2==tmp)
count++;
}
cout<<count;
return 0;
}
然后又再题解区域发现了一个python的解法,代码如下:
a, b = input(), input()
print(sum(map(lambda c: c == c[::-1], map(lambda x: a[:x] + b + a[x:], range(len(a) + 1)))))
在找朋友分析后我也大致理解了这个原理了,大致如下:
我们把代码分开讲解
list_1=map(lambda x: a[:x] + b + a[x:], range(len(a) + 1))
这个代码块实际上就实现了将b依次插入到a的不同位置并构造出了len(a)+1个对象,简单来讲就是在b每次插入到a的不同位置的新串保留到list_1
list_2=map(lambda c: c == c[::-1], list_1)
这个代码块实现的就是在list_1中遍历每个对象,找到满足原串和逆置后的串相等的串,实际上就是找到满足回文条件的串,将满足回文条件的串的结果(True or False)保存到list_2
最后对list_2求和即可找出满足回文的串的个数