PHP 字符串反转算法实现

3次阅读

php字符串反转可用strrev()、双指针递归实现;strrev()最简但不支持utf-8中文,需配合mb_substr等函数或多字节自定义函数;双指针和递归适合学习算法逻辑,时间复杂度均为o(n)。

PHP 字符串反转算法实现

PHP 中实现字符串反转有多种方式,最直接的是使用内置函数 strrev(),但若需手动实现(如面试、学习算法逻辑),可借助双指针、递归或栈等思路。关键在于理解字符串的不可变性(PHP 中字符串是值类型)及索引操作特性。

使用内置函数:最简方案

PHP 提供了开箱即用的 strrev(),适用于绝大多数场景,效率高且安全:

  • echo strrev("hello"); // 输出 "olleh"
  • 支持多字节字符(如中文)需配合 mb_ 系列函数,strrev() 本身按字节反转,对 UTF-8 中文可能乱码
  • 若处理中文,推荐:mb_substr($str, -$i, 1, 'UTF-8') 配合循环,或使用 mb_strrev()(需自定义,因 PHP 无原生多字节反转函数)

双指针法:原地模拟(适合理解算法)

将字符串转为数组,首尾交换,再拼接。虽非真正“原地”(PHP 字符串不可变),但逻辑清晰、时间复杂度 O(n):

  • 将字符串用 str_split() 转为字符数组
  • 设置左指针 $left = 0,右指针 $right = count($arr) - 1
  • 循环交换 $arr[$left]$arr[$right],然后 $left++$right--,直到 $left >= $right
  • 最后用 implode('', $arr) 合并返回

递归实现:体现函数式思维

适用于小长度字符串,直观展现“反转 = 最后一个字符 + 反转剩余部分”的定义:

立即学习PHP免费学习笔记(深入)”;

  • 边界条件:if (strlen($s)
  • 递归体:return $s[strlen($s)-1] . reverse(substr($s, 0, -1));
  • 注意:PHP 默认递归深度有限(一般 100 层左右),长字符串易触发 Fatal error
  • 对 UTF-8 字符需改用 mb_substr($s, -1, 1, 'UTF-8')mb_substr($s, 0, -1, 'UTF-8')

兼容 UTF-8 的安全反转(实用推荐)

处理中文、emoji 等多字节字符时,必须避免按字节拆分。可靠做法是先用 mb_strlen() 获取字符数,再逐个提取:

  • 初始化空字符串 $reversed = ''
  • 循环 for ($i = mb_strlen($str, 'UTF-8') - 1; $i >= 0; $i--)
  • 每次用 mb_substr($str, $i, 1, 'UTF-8') 取单个字符并拼接
  • 该方法兼容所有 Unicode 字符,性能可接受(O(n) 时间,O(n) 空间)
text=ZqhQzanResources