字符串循环移位算法

时间:2023-01-03 21:16:46

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

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

如字符串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;
}