PHP 字符串字符移动算法

2次阅读

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

PHP 字符串字符移动算法

什么是字符串字符移动

字符串字符移动是指将字符串中某些位置的字符按规则重新排列,比如把前几个字符移到末尾(左移),或把后几个字符移到开头(右移)。常见场景包括字符串轮转(如判断 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 中字符串不可变,但可转为数组模拟原地操作:

  • 将字符串转为字符数组:$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:

  • return strlen($s1) === strlen($s2) && strpos($s1 . $s1, $s2) !== false;
  • 注意:需先校验长度相等,否则 “a” 和 “aa” 会误判

不复杂但容易忽略边界处理

text=ZqhQzanResources