1.字符串的任意次数左旋转
方法1.(时间复杂度O(n^2))
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#pragma warning(disable:4996)
void Rotate(char *arr, int len,int num){//len字符串长度,num旋转次数
assert(arr != NULL);
assert(len >= 0);
assert(num >= 0);
num %= len;
while (num){//旋转次数的判断
char a = arr[0];//保存字符串的首字符
int i =0;
for (; i <len-1; i++){
arr[i] = arr[i + 1];//依次将后面的字符往前面挪
}
arr[len - 1] = a;//再将首字符放到字符串的尾
num--;
}
}
int main(){
char arr[] = "1234ABCD";
int num = 0;
printf("请输入旋转次数:");
scanf("%d", &num);
printf("before rotate:%s\n", arr);
int len = strlen(arr);
Rotate(arr, len, num);
printf("after rotate:%s\n", arr);
system("pause");
return 0;
}
方法二:时间复杂度O(n)
如字符串ABCDEF左旋三次
可将前三个字符ABC 逆置 CBA
再将后三个字符DEF逆置 FED
逆置后字符串为CBAFED
再整体逆置,字符串为DEFABC
左旋三次成功
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#pragma warning(disable:4996)
//ABC DEF
//DEFABC
//CBA FED
//DEFABC
int Rotate(char *arr,int start,int end ){//逆置函数
while (start <= end){
char temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
void LeftRotate(char *arr, int len, int num){//len字符串长度,num旋转次数
assert(arr != NULL);
assert(len >= 0);
assert(num >= 0);
num %=len;
//[0,num-1]
Rotate(arr, 0,num-1);
//printf("%s\n", arr);//测试
//[num,len-1]
Rotate(arr,num,len-1);
//printf("%s\n", arr);//测试
//[0,len-1]
Rotate(arr, 0,len-1);
//printf("%s\n", arr);//测试
}
int main(){
char arr[] = "1234ABCD";
int num = 0;
printf("请输入旋转次数:");
scanf("%d", &num);
printf("before rotate:%s\n", arr);
int len = strlen(arr);
LeftRotate(arr, len, num);
printf("after rotate:%s\n", arr);
system("pause");
return 0;
}
练习
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
使用上面两个方法也可以,只需在main在每循环依次判断依次就行
另一种方法:
#include<stdio.h>
#include<windows.h>
#include<string.h>
#pragma warning(disable:4996)
int main(){
char *s= "1234ABCD";
char *s2 = "34ABCD1";
int len1 = strlen(s);
int len2 = strlen(s2);
if (len1 != len2){
printf("no!\n");
}
else{
char *str = (char*)malloc(2 * len1 + 1);
strcpy(str, s);
strcat(str, s);
if (strstr(str, s2) != NULL){
printf("yes!");
}
else{
printf("no!");
}
free(str);
}
system("pause");
return 0;
}