字符串循环移位算法

打算好好学算法,从模仿开始,我现在写的算法都是看了别人的原理然后自己实现的。积累实在太少,很多问题想不到最优的解决方案,不过以后会好起来的。

字符串的循环移位(左移和右移原理一样)原理:

如字符串1234abcd,右移4位,实现如下

1234abcd4321abcd4321dcbaabcd234

即先反转前4个字符,再反转后4个,再全部反转。

/*
*
2013.7.23
DVD0423
function:字符串循环移位

功能描述:
定义字符串循环右移操作:把一个长度为N的字符串内的元素
循环右移K位,要求时间复杂度为O(N),空间复杂度为O(1),

输入样例:

N=8的字符串abcdefgh;

输出样例:

K=4,即字符元素右移4位,得到efghabcd。
*
*/
#include <iostream>
#include <string>
using namespace std;

void invertString(string &strN, int start, int end)
{
	int length = end - start;
	for(int i = 0; i < length/2; ++i)
	{
		char temp;
		temp = strN[end-1-i];
		strN[end-1-i] = strN[start+i];
		strN[start+i] = temp;
	}
}

void rightShift(string &strN, int K)
{
	
	int N= strN.length();
	invertString(strN, 0, N-K);
	invertString(strN, N-K, N);
	invertString(strN, 0,	N);
}

int main(int argc, char *argv[])
{
	string strN;
	int K= 0;

	cout<<"Input :\t( string, K)\n"<<endl;
	cin>>strN>>K;
	
	rightShift( strN, K);
	
	cout<<"Output :\n"
		<<strN<<endl;
	return 0;
}

 

点赞