PHP中字符串数组变位词分组实现求助(附is_anagram函数代码)
解决PHP中字符串数组变位词分组的问题
嘿,我懂你这种明明Python里顺顺当当搞定的功能,换PHP就卡壳的感觉!你写的is_anagram函数其实已经抓住了变位词的核心判断逻辑——排序后字符串完全一致就是变位词。接下来咱们把这个逻辑扩展到分组功能上,其实很简单~
先肯定你的现有代码
你的is_anagram函数思路是对的,能准确判断两个字符串是否为变位词:
function is_anagram($pharse1,$pharse2){ $status = false; if($pharse1 && $pharse2){ $pharse1=strtolower(str_replace(" ","", $pharse1)); $pharse2=strtolower(str_replace(" ","", $pharse2)); $pharse1 = str_split($pharse1); $pharse2 = str_split($pharse2); sort($pharse1); sort($pharse2); if($pharse1 === $pharse2){ $status = true; } } return $status; }
不过如果用它来做分组,需要两两对比所有字符串,效率会比较低(时间复杂度O(n²))。咱们换个更高效的方式:用排序后的字符串作为分组的唯一键,直接把同组的变位词归类。
完整的变位词分组实现
下面是基于你的判断逻辑优化后的分组函数:
function groupAnagrams($strs) { // 存储分组结果的关联数组,键是排序后的特征字符串 $groups = []; foreach ($strs as $str) { // 预处理字符串:转小写、去除空格 $cleanStr = strtolower(str_replace(" ", "", $str)); // 拆分成字符数组排序,再拼接成字符串作为分组标识键 $charArray = str_split($cleanStr); sort($charArray); $groupKey = implode('', $charArray); // 初始化分组或加入现有分组 if (!isset($groups[$groupKey])) { $groups[$groupKey] = []; } $groups[$groupKey][] = $str; } // 转换为索引数组返回,符合常规分组输出格式 return array_values($groups); } // 测试你的示例数组 $testArray = array('ate', 'map', 'eat', 'pat', 'tea' , 'tap'); print_r(groupAnagrams($testArray));
代码逻辑说明
- 生成分组标识:每个字符串清洗后(去空格、转小写),拆分成字符数组排序再拼接——这个字符串就是该变位词组的唯一“身份证”,比如
ate、eat排序后都是aet,自然会被分到同一组。 - 归类字符串:遍历每个字符串时,根据它的标识键,直接把原字符串加入对应分组数组。
- 格式化结果:用
array_values把关联数组转成索引数组,输出结构更符合日常使用习惯。
测试结果
运行代码后会得到如下输出,完全符合变位词分组的要求:
Array ( [0] => Array ( [0] => ate [1] => eat [2] => tea ) [1] => Array ( [0] => map ) [2] => Array ( [0] => pat [1] => tap ) )
内容的提问来源于stack exchange,提问作者kpako1998
相关产品推荐
相关产品推荐

