当前位置:首页 > 题解目录 > 正文内容

字符串移位包含问题

亿万年的星光5年前 (2021-01-28)题解目录4005

【题目描述】

对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。

给定两个字符串 s_1s1 和 s_2s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCDACBD则不能通过多次移位来得到其中一个字符串是新串的子串。

【输入格式】

一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过 3030。

【输出格式】

如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出"true",否则输出"false"

输出时每行末尾的多余空格,不影响答案正确性

【样例输入】

AABCD CDAA

【样例输出】

true

【题解】

一个错误代码:
测试点1 : 输入: 8 s8 正确输出:true
你的输出:false

测试点2:输入:

5XBmkALuGfBNumLs40luoG7P7Ae ymwRL77hKYRyOy15vhrCCoW3bWy

正确输出:false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<bits/stdc++.h>
using namespace std;
char s1[10000];
char s2[10000];
int zichuan(char longer[],char shorter[])//判断短的是不是长的子串
{
    int i,j,lenl,lens,s=0;
    lenl=strlen(longer);
    lens=strlen(shorter);
    for(i=0;i<lenl;i++)//这是判断从长字符串哪一位开始比较
    {
        for(j=0;j<lens;j++)//这是比较长度,等于短的长度,一位一位比
        {
            if(longer[i+j]==shorter[j]&amp;&amp;longer[i+j+1]==shorter[j+1])//判断是否连续相等
            {
                s++;
                //printf("s1[%d]=%c s2[%d]=%c s=%d\n",i+j,longer[i+j],j,shorter[j],s);
            }
        }
    }//因为最后一位是无法找到下一位也相等的,所以会少一个
    if((s+1)==lens)//上述代码会导致计算中相同的字符数比实际相同的少1个,所以要加上一位
    return 1;
    else
    return 0;
}
int main()
{
    int i,j,k,len1,len2,ans,space;
    scanf("%s",s1);
    scanf("%s",s2);
    len1=strlen(s1);
    len2=strlen(s2);
    if(len1>=len2)//1长
    {
        s1[0]=space;//
        for(j=0;j<len1;j++)//多次位移,让整个字符串不断改变
        {
            for(i=0;i<len1-1;i++)
            {
                s1[i]=s1[i+1];//把第二个以后一次往前一位
                s1[len1-1]=space;//第一个给最后
            }
            ans=zichuan(s1,s2);
            //printf("s1=%s\n",s1);
            if(ans==1)
            {
                printf("true");
                return 0;
            }
            else if(j==len1-len2-1)
            {
                printf("false");
                return 0;
            }
        }
    }
    if(len2>len1)//2长
    {
        s2[0]=space;
        for(j=0;j<len2;j++)
        {
            for(i=0;i<len2-1;i++)
            {
                s2[i]=s2[i+1];
                s2[len2-1]=space;
            }
            ans=zichuan(s2,s1);
            //printf("s2=%s\n",s2);
            if(ans==1)
            {
                printf("true");
                return 0;
            }
            else if(j==len2-len1-1)
            {
                printf("false");
                return 0;
            }
        }
    }
    return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:
    返回列表

    上一篇:第n小质数

    下一篇:生日

    相关文章

    2021年市北区程序设计竞赛试题(初中组)

    2021年市北区程序设计竞赛试题(初中组)

    1.开关灯(light.cpp)【题目描述】某实验室共有n盏灯,灯的编号为1~n,每盏灯的初始状态是关闭的。现在有m位学生,每位学生可以前去抽取一张带数字的卡片,其数字为Ai,然后依次将自己手中的数字...

    【题解】家庭问题

    【题目描述】有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有...

    【题解】钟神赛车

    【题目描述】钟神近来编码劳累,想骑车风光一番,于是找某君骑自行车比赛。已知某君和钟神的每辆自行车的速度,钟神赢一场得50银两银子,输一场赔50银两,平局不挣也不赔。钟神可以随意安排高中低档自行车的出场...

    【题解】放苹果(1)

    【题目描述】把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。【输入】第一行是测试数据的数目t(0≤t≤20)。以下...

    【题解】采摘花生2

    【题目描述】Hello Kitty又一次来到花生地里摘花生,从左上角进入花生地,从右下角出去,只能向右或者向下,请问Hello Kitty应该沿着什么样的路线走,能够摘到的花生数量最多(假设花生地里没...

    【题解】直方图

    直方图(histogram.cpp)【题目描述】给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里面最大的数。假设Fmax(Fmax<10000)是数组里最大的数,那么我们只统...