要求:时间复杂度为O(N)
思路:
将一个字符串分成两部分,X 和Y 两个部分,在字符串上定义反转的操作X^T,即把X 的所有字符反转(如,X=”abc”,那么X^T=”cba”),那么我们可以得到下面的结论:
(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。
就拿abcdef 这个例子来说,若要让def 翻转到abc 的前头,那
么只要按下述3 个步骤操作即可:
1、首先分为俩部分,X:abc,Y:def;
2、X->X^T,abc->cba, Y->Y^T,def->fed。
3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。
void reverse(char*start, char*end)
{
if (start == NULL || end ==NULL)
return;
while (start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
void *left(char *s, int pos) //pos 为要旋转的字符个数,或长度
{
int len = strlen(s);
reverse(s, s + (pos - 1)); //如上,X->X^T,即abc->cba
reverse(s + pos, s + (len - 1)); //如上,Y->Y^T,即def->fed
reverse(s, s + (len - 1)); //如上,整个翻转,(X^TY^T)^T=YX,即cbafed->defabc。
}