【牛客网】统计回文

【牛客网】统计回文

本题链接
题目描述
“回文串”是一个正读和反读都一样的字符串,比如“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的考察

发布了29 篇原创文章 · 获赞 66 · 访问量 5862

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/105249887