统计回文(C++)

题目链接

统计回文

题目描述与示例

“回文串”是一个正读和反读都一样的字符串,比如“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

解题思路

题目分析

这个题目描述的还是比较详细了,就是将第二个字符串依次插入到第一个字符串中,再判断新的字符串是否为回文结构,然后输出有几种插入方式为回文

个人思路

  1. 定义临时对象tmp保存第一个字符串
  2. 依次向临时变量中插入第二个字符串
  3. 判断是否回文,是则count++

判断回文结构的方法:

  1. 类似双指针思想,一个begin从前往后,end从后往前,判断字符是否相等
  2. 定义临时变量保存需要判断字符串的逆置形式,如果逆置后与原字符串相等则为回文结构。

代码展示

#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求和即可找出满足回文的串的个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值