字符串的n位左旋

要求:将主串的某一段(n位)翻转到主串的最后,如:abcdef以2位翻转则结果为:cdefab。要求时间复杂度为O(n),空间复杂度为O(1)

思路一:可以重新定义一个与原串相同大小的字符数组result[len],用来存放最终结果,先将原串中的后len-n位复制到result[len]数组的前len-n位,然后将原串的前n位复制到result[len]中的后n位,但这种思路要求重新定义一个中间字符数组用来存放结果。显然空间复杂度不满足要求。

思路二:考虑到句内单词反转这个思路(具体可参看我的博客:句内单词反转),我们可以按位实现三步反转,即对前半部分反转,对后半部分反转,对整体进行反转。基于此思路代码如下:

#include<iostream>
using namespace std;
//该函数实现字符串的反转
void reserve(char *pstr,int start,int end)
{
	while(pstr[start]!='\0'&&start<=end)
	{
		swap(pstr[start],pstr[end]);
		start++;
		end--;
	}
}
//该函数实现字符长的按n位左旋
void left_reserve(char *pstr,int pos)
{
	int len=strlen(pstr);
	reserve(pstr,0,pos-1);//对前半部分反转
	reserve(pstr,pos,len-1);//对后半部分反转
	reserve(pstr,0,len-1);//对总体进行反转

}
void main()
{
	char str[]={"abcdefg"};
	left_reserve(str,2);
	cout<<str<<endl;
}
对复杂度分析:反转函数通过一个while循环来扫描主串,时间复杂度为O(n),
用到swap函数空间复杂度为O(1)

程序运行结果如下:



posted on 2016-03-10 21:59  海南一哥  阅读(257)  评论(0编辑  收藏  举报

导航