字符串字符移动是将字符串中字符按规则重排,如左移或右移;基础实现用子串拼接,原地优化可用三次翻转法(转数组后操作)。

什么是字符串字符移动
字符串字符移动是指将字符串中某些位置的字符按规则重新排列,比如把前几个字符移到末尾(左移),或把后几个字符移到开头(右移)。常见场景包括字符串轮转(如判断 s2 是否为 s1 的旋转字符串)、密码偏移、滑动窗口预处理等。
基础左移/右移实现
给定字符串 $s 和移动位数 $k,左移 $k 位等价于取子串 $s[$k..] 拼接 $s[0..$k-1];右移 $k 位则等价于左移 strlen($s) - $k,或直接拼接 $s[-$k..] 和 $s[0..-$k-1]。
- 左移 $k 位(自动取模避免越界):
php
function strLeftRotate($s, $k) {
$n = strlen($s);
if ($n === 0) return $s;
$k = $k % $n;
return substr($s, $k) . substr($s, 0, $k);
}
?> - 右移 $k 位(推荐用左移等价转换):
return strLeftRotate($s, $n - ($k % $n));
原地移动优化(不额外分配字符串)
若需空间复杂度 O(1)(仅用常数额外变量),可用三次翻转法:对长度为 n 的字符串,右移 k 位可拆解为——
① 翻转整个字符串;② 翻转前 k 个字符;③ 翻转后 n−k 个字符。PHP 中字符串不可变,但可转为数组模拟原地操作:
C编写,实现字符串摘要、文件摘要两个功能。里面主要包含3个文件: Md5.cpp、Md5.h、Main.cpp。其中Md5.cpp是算法的代码,里的代码大多是从 rfc-1321 里copy过来的;Main.cpp是主程序。
- 将字符串转为字符数组:
$arr = str_split($s); - 定义翻转函数:
function reverse(&$arr, $i, $j) { while ($i - 执行三次翻转:
$n = count($arr); $k = $k % $n; reverse($arr, 0, $n-1); reverse($arr, 0, $k-1); reverse($arr, $k, $n-1); return implode('', $arr);
判断是否为旋转字符串
经典应用:判断 $s2 是否为 $s1 的字符移动结果(即是否存在 k,使 s1 左移 k 位后等于 s2)。最优解是检查 $s2 是否为 $s1.$s1 的子串,时间复杂度 O(n),无需枚举 k:
立即学习“PHP免费学习笔记(深入)”;
- return strlen($s1) === strlen($s2) && strpos($s1 . $s1, $s2) !== false;
- 注意:需先校验长度相等,否则 "a" 和 "aa" 会误判










