字符串-字符串的旋转

问题:给定一个字符串,将字符串前面若干个字符移到字符串尾部
例子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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值