问题:给定一个字符串,将字符串前面若干个字符移到字符串尾部
例子abcdef前三个字符移动到后面,变成defabc
方法一 蛮力位移
时间复杂度为O(m*n),空间复杂度为O(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void LeftShiftOne(char *str,int n)
{
char tmp=str[0];
int i;
for (i=1;i<n;i++)
{
str[i-1]=str[i];
}
str[n-1]=tmp;
}
void LeftRotateString(char *str,int n,int m)
{
while(m--)
{
LeftShiftOne(str,n);
}
}
int main()
{
char arr[]="abcdef";
printf("Before Rotate %s\n",arr);
LeftRotateString(arr,strlen(arr),3);
printf("After Rotate %s\n",arr);
}
输出:
Before Rotate abcdef
After Rotate defabc
方法二 三步反转
1.将原来的字符串分为两部分, X部分为abc,Y部分为def
2.X反转为cba,Y反转为fed,则原来的字符串变为cbafed
3.整体再翻转年为defabc
时间复杂度为O(n),空间复杂度为O(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ReverseString(char *str,int from,int to)
{
char tmp;
while(from < to)
{
tmp=str[from];
str[from++]=str[to];
str[to--]=tmp;
}
}
void LeftRotateString(char *str,int n,int m)
{
m=m%n;
ReverseString(str,0, m-1);
ReverseString(str,m, n-1);
ReverseString(str,0, n-1);
}
int main()
{
char arr[]="abcdefg";
printf("Before rotate %s\n",arr);
LeftRotateString(arr,strlen(arr),3);
printf("After rotate %s\n",arr);
}
输出:
Before rotate abcdefg
After rotate defgabc
作业:输入一个英文句子 假如输入的是I am a student. 变成student. a am I
思路:从后往前搜索,搜索到空格就将这一区间的字符串反转,最后将全部字符串反转
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Reverse(char *str,int from,int to)
{
char tmp;
while (from < to)
{
tmp=str[from];
str[from++]=str[to];
str[to--]=tmp;
}
}
void RotateString(char *str,int n)
{
int from;
int to;
for (from=n-1;from>=0;from--)
{
to=from;
//while (str[from] != 32)//' '的ascii是32
while (str[from] != ' ')
{
if(from==0)
{break;}
from--;
}
if(from == 0)
{
Reverse(str,from,to);
break;
}
Reverse(str,from+1,to);
}
Reverse(str,0,n-1);
}
int main()
{
char arr[]="I am a student.";
printf("%s\n",arr);
RotateString(arr,strlen(arr));
printf("%s\n",arr);
}
输出:
I am a student.
student. a am I
student. a am I