列表

详情


JD11. 回文

描述

京京和东东是好朋友。东东很喜欢回文。回文是指从前往后读和从后往前读是一样的词语。京京准备给东东一个惊喜,先取定一个字符串s,然后在后面附上 0 个或者更多个字母形成回文,京京希望这个回文越短越好。请帮助京京计算他能够得到的最短的回文长度。

数据范围:输入的字符串长度满足 ,且保证只含有小写英文字母

输入描述

输入包括一个字符串s,字符串s长度length

输出描述

输出一个整数,表示牛牛能够得到的最短的回文长度。

示例1

输入:

abab

输出:

5

说明:

在末尾添加一个 'a' 构成回文

示例2

输入:

a

输出:

1

说明:

本身就是回文

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 228KB, 提交时间: 2019-05-01

int length(char *str);
int judgement(char *str, int len);
  
int main(void)
{
    int out;
    char str[51];
      
    scanf("%s", str);
    out = length(str);
    printf("%d", out);
    return 0;
}
  
int length(char *str)
{
    int i, j;
    int len;
    char buffer[99];
      
    len = 0;
    while (str[len])
    {
        buffer[len] = str[len];
        len++;
    }
    for (i = 0; i < len; i++)
    {
        for (j = i - 1; j >= 0; j--) buffer[len + (i - 1 - j)] = buffer[j];
        if (judgement(buffer, len + i)) return i + len;
    }
    return i + len - 1;
}
  
int judgement(char *str, int len)
{
    int i;
      
    for (i = 0; i < len / 2; i++) if (str[i] != str[len - 1 - i]) return 0;
    return 1;
}

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2019-04-29

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{   
    char s[51];
	gets(s);
	int len=strlen(s);//包含了空格
	int i=0,j=len-1;
	int flag=0;
	int num=0;
	int p,k;
	/*

	while(s[i]==s[j])
	{
		i++;
		j--;
	}
	if(i>=j)
	{
		printf("%d\n",len);
		flag=2;
	}

  */
	


	for(i=0;i<=len-2;i++)
	{
		num=0;
		p=len-1;
	    if(s[i]==s[len-1])
		{
			k=i;
			while(s[p]==s[k])
			{
			    num+=2;
		    	p--;
			    
			    k++;
				if(p<k)//偶数对称
				{
				  
					flag=1;
			        break;
				}
				if(p==k)//奇数对称
				{
			    	flag=3;
			        break;
				}
					
			}
		}

		if(flag==3)
		{	num++;
			break;
		}

		if(flag==1)
		{	
			break;
		}
		
	}
	if(num==0)
	
		printf("%d\n",2*len-1);
	else
		printf("%d\n",2*len-num);

    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2019-01-18

int length(char *str);
int judgement(char *str, int len);

int main(void)
{
    int out;
    char str[51];
    
    scanf("%s", str);
    out = length(str);
    printf("%d", out);
    return 0;
}

int length(char *str)
{
    int i, j;
    int len;
    char buffer[99];
    
    len = 0;
    while (str[len]) 
    {
        buffer[len] = str[len];
        len++;
    }
    for (i = 0; i < len; i++)
    {
        for (j = i - 1; j >= 0; j--) buffer[len + (i - 1 - j)] = buffer[j];
        if (judgement(buffer, len + i)) return i + len;
    }
    return i + len - 1;
}

int judgement(char *str, int len)
{
    int i;
    
    for (i = 0; i < len / 2; i++) if (str[i] != str[len - 1 - i]) return 0;
    return 1;
}

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

int length(char *str);
int judgement(char *str, int len);

int main(void)
{
    int out;
    char str[51];
    
    scanf("%s", str);
    out = length(str);
    printf("%d", out);
    return 0;
}

int length(char *str)
{
    int i, j;
    int len;
    char buffer[99];
    
    len = 0;
    while (str[len]) 
    {
        buffer[len] = str[len];
        len++;
    } 
     
    for (i = 0; i < len; i++)
    {
        for (j = i - 1; j >= 0; j--) buffer[len + (i - 1 - j)] = buffer[j];
         
        if (judgement(buffer, len + i)) return i + len;
    }
    return i + len - 1;
}

int judgement(char *str, int len)
{
    int i;
    
    for (i = 0; i < len / 2; i++) if (str[i] != str[len - 1 - i]) return 0;
    return 1;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-04-07

#include<stdio.h>
#include<string.h>
int main(){
    char s[50];
    scanf("%s",s);
    int l,i,j,t=1,m;
    l=strlen(s);
    for(i=0;i<l;i++){
        t=1;
        for(j=i;j<=(l+i)/2;j++){
            if(s[j]!=s[l-1-(j-i)]){
                t=0;
                break;
            }
        }
            if(t==0)
                continue;
            else 
                break;
    }
    printf("%d",l+i);
    return 0;
}

上一题