本文主要是介绍《剑指offer》之左旋字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
判断一个字符串是否为另外一个字符串旋转之后的字符串。
输入示例:输入字符串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》之左旋字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!