列表

详情


MGJ5. 回文串

描述

给定一个字符串,问是否能通过添加一个字母将其变为回文串。

输入描述

一行一个由小写字母构成的字符串,字符串长度小于等于10。

输出描述

输出答案(YES\NO).

示例1

输入:

coco

输出:

YES

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2021-09-22

#include <stdio.h>
#include <string.h>

int main()
{
    char s[16];
    while(scanf("%s",s)!=EOF)
    {
        int len=strlen(s);
        if(len%2==0)
        {
            int index=len/2,i;
            for(i=1;i+index<len;i++)
                if(s[index+i]!=s[index-i])
                    break;
            if(i+index==len)
            {
                printf("YES\n");
                continue;
            }
            index=len/2-1;
            for(i=1;index-i>=0;i++)
                if(s[index+i]!=s[index-i])
                    break;
            if(i-index==-1)
            {
                printf("YES\n");
                continue;
            }
        }
        else
        {
            int index=len/2,i;
            for(i=0;index+1+i<len;i++)
                if(s[index-i]!=s[index+1+i])
                    break;
            if(index+1+i==len)
            {
                printf("YES\n");
                continue;
            }
            for(i=0;index-1-i>=0;i++)
                if(s[index+i]!=s[index-1-i])
                    break;
            if(index-1-i==-1)
            {
                printf("YES\n");
                continue;
            }
        }
        printf("NO\n");
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 308KB, 提交时间: 2021-09-18

#include<stdio.h>
#include<string.h>
int main()
{
	char str[100];
	while (gets(str))
	{
		int i,j,k,f=0;
		char t[100];
		for(i=0;i<strlen(str);i++)
		{
			strcpy(t,str);
			for(j=i;j<=strlen(str);j++)
			{
				t[j]=t[j+1];
			}
			j=0;
			k=strlen(t)-1;
			while (j<k)
			{
				if(t[j]!=t[k]) break;
				j++;
				k--;
			}
			if(j>=k)
			{
				printf("YES\n");
				f=1;
				break;
			}
		}
		if(f!=1) printf("NO\n"); 
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2018-11-04

#include<stdio.h>
#include<string.h>
int main(){
    char s[11];
    while(scanf("%s",s)!=EOF){
        int i,j,p1,p2,flag=0;;
       for(i=0,j=strlen(s)-1;i<j&&s[i]==s[j];i++,j--);
           if(i>=j)
               printf("YES\n");
           else {
               p1=i;p2=j;
               j=j-1;
               for(;i<j&&s[i]==s[j];i++,j--);
                   if(i>=j){
                       printf("YES\n");
                       flag=1;}
               else {
                   p1=p1+1;
                   for(;p1<p2&&s[p1]==s[p2];p1++,p2--);
                   if(p1>=p2){
                       printf("YES\n");
                       flag=1;}
               }
           }
        if(flag==0)
            printf("NO\n");
    }
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>

bool IsReverse(const char* str,int size)
{
	int i = 0, j = size - 1;
	for (; i < j; i++, j--)
	{
		if (str[i] != str[j])
		{
			return false;
		}
	}
	return true;
}

bool IsAddWord(const char* str,int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp[10];
		int k = 0;
		for (int j = 0; j < size; j++)
		{
			if (j != i)
			{
				tmp[k] = str[j];
				k++;
			}
		}
		if (IsReverse(tmp, k))
		{
			return true;
		}
	}
	return false;

	return false;
}
int main()
{
	char s[10];
	int size;
	while (scanf("%s",s) != EOF)
	{
		int size = strlen(s);
		if (IsAddWord(s,size))
		{
			printf("YES\n");
		}
		else
		{
			printf("NO\n");
		}
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-09-13

# include<stdio.h>
int main(){
    char str[10];
    while(scanf("%s",&str)!=EOF){
        int err = 1;
        int index = 0;
        int len  =0;
        while(str[index] - '\0' != 0){
            len++;
            index++;
        }
        int low = 0;
        int high = len -1;
        
        while(low < high){
            if (str[low] - str[high] != 0){
                err--;
                if (str[low] - str[high-1] != 0 && str[low+1] - str[high]!=0){
                    err = -1;
                    break;
                }else if (str[low] - str[high-1] != 0){
                    low++;
                }else{
                    high--;
                }
            }else{
                low++;
                high--;
            }
        }
        if (err < 0 )    printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

上一题