问题描述:给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。例如移动字符串mission的前两个字符到尾部,就变成了ssionmi。
实现函数:void RotateString(char *s, int n, int m)
分析
暴力移位:时间复杂度O(mn)
三次翻转:时间复杂度O(n)
代码
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1000
void RotateString(char *s,int n,int m);
void ReverseString(char *s ,int from, int to);
int main(int argc, char *argv[]){
char s[MAXSIZE];
int m = 0;
int n = 0;
scanf("%s %d",s,&m);
n = strlen(s);
printf("%s\n",s);
RotateString(s,n,m);
printf("%s\n",s);
return 0;
}
void RotateString(char *s, int n, int m){
m = m % n;
ReverseString(s,0,m-1);
ReverseString(s,m,n-1);
ReverseString(s,0,n-1);
}
void ReverseString(char *s ,int from, int to){
while(from < to){
char tmp = s[from];
s[from] = s[to];
s[to] = tmp;
from++;
to--;
}
}
重点
- 注意三次翻转的范围
- 考虑m>n的情况