Openjudge-NOI题库-字符串移位包含问题

题目描述 Description

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

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

输入输出格式 Input/output
输入:
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
输出:
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
输入输出样例 Sample input/output

样例测试点#1

输入样例:
AABCD CDAA
输出样例:
true
说明 description

结果可能很大!

思路:

我们可以对循环移位之后的结果进行分析。
以S1 = ABCD为例,先分析对S1进行循环移位之后的结果,如下所示:
ABCD--->BCDA---->CDAB---->DABC---->ABCD……
假设我们把前面的移走的数据进行保留,会发现有如下的规律:
ABCD--->ABCDA---->ABCDAB---->ABCDABC---->ABCDABCD……
因此,可以看出对S1做循环移位所得到的字符串都将是字符串S1S1的子字符串。如果S2可以由S1循环移位得到,那么S2一定在S1S1上,这样时间复杂度就很低,而且又快速。

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int fun(string src,string des)
 4 {
 5     string tmp = src;
 6     src=src+tmp;
 7     if(strstr(src.c_str(),des.c_str())==NULL)//指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
 8     {
 9         return 0;
10     }
11     return 1;
12 }
13 int main()
14 {
15     int i=0,j=0;
16     char a[31];
17     char b1[31],b2[32];
18     /*=======================*/
19     gets(a);
20     while(a[i]!=‘ ‘)
21     {
22         b1[i]=a[i];
23         i++;
24     }
25     b1[i]=‘\0‘;
26     i++;
27     while(a[i]!=‘\0‘)
28     {
29         b2[j]=a[i];
30         i++;
31         j++;
32     }
33     b2[j]=‘\0‘;
34     /*=======================*///空格分开存储
35     if(fun(b1,b2)==1)
36         printf("true\n");
37     else
38         printf("false\n");
39 }
时间: 2024-08-04 00:11:56

Openjudge-NOI题库-字符串移位包含问题的相关文章

Openjudge NOI题库 ch0111/05 派

总时间限制: 1000ms 内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成:可以是一整个派). 我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨.因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好.当然,我也要给自己留一块,而这一块也要和其他人的同样大小. 请问我们每个人拿到的派最

Openjudge NOI题库 ch0111/01 查找最近的元素

总时间限制: 1000ms 内存限制: 65536kB 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000.第二行包含n个整数,为非降序列各元素.所有元素的大小均在0-1,000,000,000之间.第三行包含一个整数m,为要询问的给定值个数.1 <= m <= 10000.接下来m行,每行一个整数,为要询问最接近元素的给定值.所有给定值的大小均在0-1,000,000,000之间. 输出 m行,每行一个

Openjudge NOI题库 ch0111/10 河中跳房子|NOIP2015 day2 stone

这题同时也是NOIP2015 D2T1 跳石头 stone 原题. 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石.在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L). 在比赛过程中,奶牛轮流从起点

Openjudge NOI题库 ch0111/07 和为给定数

总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行:第一行是整数n(0 < n <= 100,000),表示有n个整数.第二行是n个整数.整数的范围是在0到10^8之间.第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和. 输出 若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开.若有多个数对满足条件,选择数对中较小的数更小的.若找不到符合要求的数对,输出一行No

Openjudge NOI题库 ch0111/08 不重复地输出数

这题水得和二分点关系没有,这篇文纯粹凑数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个数,从小到大将它们输出,重复的数只输出一次.保证不同的数不超过500个. 输入 第一行是一个整数n.1 <= n <= 100000.之后n行,每行一个整数.整数大小在int范围内. 输出 一行,从小到大不重复地输出这些数,相邻两个数之间用单个空格隔开. 样例输入 5 2 4 4 5 1 样例输出 1 2 4 5 1 #include <stdio.h> 2 #inclu

Openjudge NOI题库 ch0111/t1776 木材加工

总时间限制: 1000ms 内存限制: 65536kB 描述 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了.当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度. 木头长度的单位是厘米.原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数. 输入 第一行是两个正整数N和K(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目.接下来的N行,每行有一个1到1000

Openjudge NOI题库 数论4975 两只鼹鼠

总时间限制: 1000ms 内存限制: 65536kB 描述 一个圆形花圃被分为k个扇形区域(0,1,-,k-1).有两只小鼹鼠A,B分别位于其中的两个区域.鼹鼠从一个扇形区域移动到相邻的区域需要1分钟.已知A鼹鼠总是沿顺时针方向移动(序号增大),B鼹鼠总是沿逆时针方向移动(序号减小),两只鼹鼠都是每隔一段时间钻出地面一次.请你求出两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间.如果永远遇不到,则输出"no answer". 输入 第一行为一个整数k,表示扇形区域的个数.1 <

编程之美之字符串移位包含问题

[题目] 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. [分析] [思路一] 从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性. 字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通的方法,时间复杂度为O(n*m),总体复杂度为O(n*n*m). 字符串包含判断,若采

CareerCup之1.8 字符串移位包含问题

[题目] 原文: 1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotat