列表

详情


JD10. 两个子串

描述

给定一个字符串 s , 请计算输出含有连续两个 s 作为子串的最短字符串。 注意两个 s 可能有重叠部分。例如, "ababa" 含有两个 "aba".

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

输入描述

输入包括一个字符串s,字符串长度length(1 ≤ length ≤ 50),s中每个字符都是小写字母.

输出描述

输出一个字符串,即含有连续两个s作为子串的最短字符串。

示例1

输入:

abracadabra

输出:

abracadabracadabra

示例2

输入:

a

输出:

aa

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-08-06

#include<stdio.h>
#include<string.h>
int main(){
    char x[100]={'\0'};
    char y[50]={'\0'};
    scanf("%s",x);
    int len=strlen(x);
    strcpy(y,x);
    int m,n;
    int flag;
    int t;
    for(m=1;m<len;m++)
    {
        flag=0;
        if(x[m]==x[0])
        {
            t=1;
            for(n=m+1;n<len;n++)
            {
                if(x[n]!='\0'&&x[n]!=x[t])
                {
                    flag=1;
                    break;
                }
                t++;
            }
             if(flag==0)
        {
            for(int k=0;k<len;k++)
            {
                if(t<len)
                    y[k]=y[t];
                else
                    y[k]='\0';
                t++;
            }
            break;
        }
        }
       

    }
    strcat(x, y);
    printf("%s",x);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2021-08-24

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000];
    while (gets(a))
    {
        int i,j,i_,j_,len,max=0,t=0;
        for(i=0;i<strlen(a);i++)
        {
            for(j=i+1;j<strlen(a);j++)
            {
                len=0;
                if(a[i]==a[j])
                {
                    i_=i;
                    j_=j;
                    while (a[i_]==a[j_])
                    {
                        i_++;
                        j_++;
                        len++;
                        if(j_>=strlen(a)&&t==0&&i==0)
                        {
                            max=len;
                            t=1;
                        }
                    }
                }
            }
        }
        for(i=0;i<strlen(a);i++) printf("%c",a[i]);
        for(i=max;i<strlen(a);i++) printf("%c",a[i]);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-10-19

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

int main(){
    char s[100];
    gets(s);
    int len = strlen(s);
    int l=0;
    for(int i=len-1;i>=1;i--){
        int j=0;
        int k=i;
        while(k<len){
            if(s[j]==s[k]){
                j++;
                k++;
            }
            else break;
        }
        if(k==len){
            l=len-i;
        }
    }
    printf("%s",s);
    for(int m=l;m<len;m++){
        printf("%c",s[m]);
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-09-06

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char a[50];
	gets(a);
	int num = strlen(a);
	int k, flag = 0;
	int i = 0;
	for (int x = 0; x < num; x++)
	{
		printf("%c", a[x]);
	}
		//printf("%c", a[i]);
		for (int j = i + 1; j<num; j++)
		{
			if (a[i] == a[j])
			{
				//printf("%c", a[j]);
				for (k = 1; k < (num - j); k++)
				{
					if (a[i + k] != a[j + k])//第一个重复字符后面的字符是否重复
						break;
				}
				//printf("k=%d,num-j=%d\n", k,num-j);
				if (k == (num - j))//字符串最后一个字符是重复的,一直重复到a[i+k-1];
				{
					flag = i + k;
					//printf("flag=%d\n", flag);
					break;	
				}
			}
		}

	
	for (int i = flag; i<num; i++)
		printf("%c", a[i]);
	//printf("flag=%d\n", flag);
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2018-09-07

#include<stdio.h>
#include<string.h>
int main(){
    char a[1001];
    int length,t,flag=0,sum=0,n=0;
    gets(a);
    length=strlen(a);
    t=length;
    for(int i=0;i<length;i++){
        if(a[i]==a[n+1]){
            flag++;
            n++;
            if(n==length-1){
                break;
            }
        }
        else{
            i=-1;
            n++;
            if(n==length-1){
                break;
            }
            else{
                flag=0;
            }
        }
    }
  
    for(int i=0;i<t;i++){
        printf("%c",a[i]);
    }
    for(int i=flag;i<t;i++){
        printf("%c",a[i]);
    }
  }

上一题