判断一个字符串是否为另外一个字符串左旋或右旋之后的字符串

题目:

断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = abcdef和s2 = cdefab,返回1,给定s1=abcd和s2=ACBD,返回0.

abcdef左旋一个字符得到bcdefa

abcdef左旋两个字符得到cdefab

abcdef右旋一个字符得到fabcde

abcdef右旋两个字符得到efabcd

题目分析:

根据这个题目,我们能够和字符串的左旋和右旋联系起来,如果把给定的字符串拷贝一份放在给定字符串之后,例如:给定字符串abcdef,经过拷贝后得到字符串abcdefabcdef,观察这个字符串,能够发现给定的字符串abcdef经过左、右旋的所有情况为字符串abcdefabcdef的子串,则问题转换为判断另一个字符串是否是字符串abcdefabcdef的子串。整个问题可以借助两个库函数解决,下面为具体的程序:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
     char arr[20] = "abcdef";
     char *p = "bcdefa";
     char *ret = NULL;
     strncat(arr, arr, strlen(arr));   
     ret = strstr(arr, p);
     if(ret != NULL)
     {
         printf("OK\n");
      }
     else
     {
         printf("NO\n");
     }
system("pause");
return 0;
 
}

下面说明一下strncat和strstr的具体功能:

strncat函数:

头文件:#inclue <string.h>

strncat()用于将n个字符追加到字符串的结尾,其原型为:
    char * strncat(char *dest, const char *src, size_t n);

【参数说明】dest为目标字符串,src为源字符串,n为要追加的字符的数目。

strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部。

strncat()会将dest字符串最后的‘\0‘覆盖掉,字符追加完成后,再追加‘\0‘。

【返回值】返回字符串dest。

strstr函数:

包含文件:string.h     

函数原型:extern
char *strstr(char *str1, char *str2);  

 

【功能】找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   

【返回值】返回该位置的指针,如找不到,返回空指针。

时间: 2024-10-12 21:10:35

判断一个字符串是否为另外一个字符串左旋或右旋之后的字符串的相关文章

C语言编程 字符串的旋转(左旋右旋及判断)

此前不太熟悉这种类型的题目,特此做一个合计的方法总结.包括字符串中字符的左旋(右旋),和判断一个字符串是否是由另一个字符串旋转(左旋或者右旋)而来. 一.字符串的左旋(右旋) 由于左旋和右旋思路一致,这里仅介绍左旋方法.这种题目有两种思路:1.首字符的后置以及其余元素的往前推置,循环重复此过程K次(k为左旋字符个数). eg:字符串为"ABCDEF\0",要旋转2个字符,首先保存首字符到一个变量,然后把其余变量全部提前一位置放,即为"BCDEF \0"(此处注意,最

php如何判断一个字符串是否包含另一个字符串

来自1:http://blog.sina.com.cn/s/blog_8edc37a801016yha.html -------------------------------------------------------------------- 我觉得最简单的就是:(用这种最好,StrPos效率最高) strpos($a, $b) !== false 如果$a 中存在 $b,则为 true ,否则为 false. 用 !== false (或者 === false) 的原因是如果 $b 正

【c语言】判断一个字符串是否为另外一个字符串旋转之后的字符串

// .判断一个字符串是否为另外一个字符串旋转之后的字符串. // 例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0 #include <stdio.h> #include <string.h> #include <assert.h> int rotate(char *p, char *q) { assert(p != NULL && q != NULL); strncat(p,p,strlen(p

ES6--javascript判断一个字符串是否存在另一个字符串中

es5中我们经常使用indexof()方法来判断一个字符串是否包含另外一个字符串中. 如果存在则返回匹配到的第一个索引值.如果没有则返回 -1.所以,判断一个字符串是否包含另外一个字符串中只需要判断是否为-1就行.-1代表不存在. 例如: let str = 'Hello World!'; console.log(str.indexOf('H'));//0 str中"H"的出现的第一个索引为0 console.log(str.indexOf('o'));//4 str中"o&

两种方法判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言)

例如:给定s1 = AABCD和s2 = BCDAA,返回1给定s1 = abcd和s2 = ACBD,返回0. AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAA 第一种:通过其中一个字符串向左移动确定第二个字符串 #include<stdio.h> #include<string.h> void left_move(char *str, int k) { while (k != 0) { char *cur = str;//必须需要另一个指针存储首地址 c

给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串

1 /* 2 * 给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串,其实也就是变位词问题 3 * 比如说 a='abc' b='acb'是可以通过a变成b的 4 * 思路; 5 * 1.应进行分析,变位词区分大小写吗?比如God和dog是变位词?还需要考虑空格问题? 6 * 在这里我们假定是区分大小写的. 7 * 2.比较两个字符串时,如果它们的长度都不相等了,那肯定不是变位词 8 * 9 * 10 * */ 11 12 public class IsSameString

【c语言】编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。

/*编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列. 要求:不能使用C函数库中的字符串操作函数.*/ #include <stdio.h> #include <assert.h> void reverse_string(char const * string) { assert( string != NULL ); if( *string != '\0' ) { string++; reverse_string

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

java集合TreeMap应用---求一个字符串中,每一个字母出现的次数

package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public class TestMap { /** * 练习: * "fdgavcbsacdfs+++AA&&BBB" 获取该字符串中,每一个字母出现的次数. * 要求打印结果是:a(2)b(1)...; * 思路: * 对于结果的分析发现,字母和次数之间存在