列表

详情


WY18. 统计回文

描述

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

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 360KB, 提交时间: 2018-08-22

#include<stdio.h>
#include<string.h>
int AAA(char *A,char *B,int lena,int lenb,int count);
int main()
{
    char A[100];
    char B[100];
    int count=0;
    gets(A);
    gets(B);
    int lena=strlen(A);
    int lenb=strlen(B);
   
    printf("%d",AAA(A,B,lena,lenb,count));
    return 0;
}
int AAA(char *A,char *B,int lena,int lenb,int count)
{
    char C[210];
    int i,j,m;
    for(i=0;i<lena+1;i++)
    {
        int p=0;
        int result=1;
        for(j=0;j<i;j++)
        {C[p]=A[j];
         p++;
        }
        for(m=0;m<lenb;m++)
        {
            C[p]=B[m];
            p++;
        }
        for(j=i;j<lena;j++)
        {
            C[p]=A[j];
            p++;
        }
        for(j=0;j<(p/2);j++)
        {
            if(C[j]==C[p-j-1])
                continue;
            else result=0;
        }
        //printf("%d%s\n",p,C);
        if(result==1)
            count++;
    }
    return count;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2017-08-28

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
    string strA, strB;
    cin >> strA;
    cin >> strB;
    int i;
    int count = 0;
    for(i = 0; i <= strA.length(); i++){
        string strC = strA;
        strC.insert(i, strB);
        string strD = strC;
        reverse(strD.begin(), strD.end());
        if(strC == strD)
            count++;
    }
    cout << count << endl;
    return 0;
}

上一题