《剑指offer》之左旋字符串
- 开源代码
- 2025-08-04 18:12:02

判断一个字符串是否为另外一个字符串旋转之后的字符串。
输入示例:输入字符串s1 和 s2, 并且会输入移动位数。
例如:给定 s1 =AABCD 和 s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
方法一一个一个移动,判断是否相同。
#include <stdio.h> #include <string.h> int Find(char* str1, char* str2) { int flag = 0;//判断是否为左旋字符串 int len = strlen(str1); int i = 0, j = 0; for (i = 0; i < len; i++) { char tmp = str1[0]; for (j = 0; j < len - 1; j++) { str1[j] = str1[j + 1]; } str1[j] = tmp; if (strcmp(str1, str2) == 0) { flag = 1; break; } } return flag; } int main() { char str1[10]; char str2[10]; gets(str1); gets(str2); int flag = Find(str1, str2); if (flag) { printf("是左旋后的字符串\n"); } else { printf("不是\n"); } return 0; } 方法二使用库函数 strcpy 和 strncat;将 str1 后半部分 拷贝到arr1 里面,再将 str1 的前半部分拼接到 arr1 里面,最后判断 arr1 是否和 str2 一致即可。
#include <stdio.h> #include <string.h> int main() { char str1[10]; char str2[10]; char arr1[20]; gets(str1); gets(str2); int n; scanf("%d", &n);//输入左移几位 int len = strlen(str1); int k = n % len; //实际移动位数 strcpy(arr1, str1 + k);//将str1后半部分 拷贝到arr1里面 strncat(arr1, str1, k); //将str1 的前半部分拼接到arr1里面 if (strcmp(arr1, str2) == 0) { printf("是旋转后的字符串\n"); } else { printf("不是\n"); } return 0; } 方法三三段翻转:
#include <stdio.h> #include <string.h> void reverse(char* p, int str, int end) { char tmp = p[str]; for (int i = str; i < end; i++) { p[i] = p[i + 1]; } p[end] = tmp; } int main() { char str1[10]; char str2[10]; gets(str1); gets(str2); int len = strlen(str1); int n; scanf("%d", &n); reverse(str1, 0, n - 1); reverse(str1, n - 1, len - 1); reverse(str1, 0, len - 1); if (strcmp(str1, str2) == 0) { printf("是旋转后的字符串\n"); } else { printf("不是\n"); } return 0; }《剑指offer》之左旋字符串由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“《剑指offer》之左旋字符串”