左旋转字符串

来源:互联网 发布:斑马标签机打印软件 编辑:程序博客网 时间:2024/05/16 15:01

左旋转字符串

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾 部,如把字符串 abcdef 左旋转 2 位得到字符串 cdefab。请实现字符串左旋转的 函数,要求对长度为 n 的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。

思路:三步反转法

将一个字符串分成两部分,X 和 Y 两个部分,在字符串上定义反转的操作 X^T, 即把 X 的所有字符反转(如,X=”abc”,那么 X^T=”cba”),那么我们可以得到 下面的结论:(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。不是么?ok,就拿 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,即整个翻转。

PHP代码实现

function reverseString(&$str, $from, $to) {    while ($from < $to) {        $tmp = $str[$from];        $str[$from++] = $str[$to];        $str[$to--] = $tmp;    }}function rotateString(&$str, $n, $m) {    $m %= $n;    reverseString($str, 0, $m - 1);    reverseString($str, $m, $n - 1);    reverseString($str, 0, $n - 1);}$str = 'abcdef';rotateString($str, 6, 2);echo $str;
原创粉丝点击