判断字符串能否重排为回文串的关键是:出现奇数次的字符个数 ≤ 1;偶长串要求全字符频次为偶,奇长串允许且仅允许一个字符频次为奇。

判断一个字符串是否能重新排列成回文串,关键不是检查原字符串是否回文,而是看它的字符频次是否满足“至多一个字符出现奇数次”。
核心判断逻辑
回文串(如 "aba"、"abba")对称,因此: - 长度为偶数时,每个字符必须出现偶数次; - 长度为奇数时,有且仅有一个字符可出现奇数次(放在中间),其余均为偶数次。 → 合并起来就是:整个字符串中,出现奇数次的字符个数 ≤ 1。
用数组统计字符频次(推荐)
PHP 中可用 count_chars() 或手动遍历 + 关联数组统计。更直观的是:
- 用
str_split($s)拆成字符数组 - 用
array_count_values()统计各字符出现次数 - 遍历频次数组,统计有多少个值是奇数
- 返回
$oddCount
简洁实现示例
// 示例函数
function canPermutePalindrome($s) {<br>
$freq = array_count_values(str_split($s));<br>
$oddCount = 0;<br>
foreach ($freq as $count) {<br>
if ($count % 2 == 1) $oddCount++;<br>
}<br>
return $oddCount <= 1;<br>
}
调用:var_dump(canPermutePalindrome("aab")); // true(可排成 "aba")var_dump(canPermutePalindrome("abc")); // false
立即学习“PHP免费学习笔记(深入)”;
注意大小写与空格
若题目要求忽略大小写或空白符,需预处理:
- 统一转小写:
strtolower($s) - 过滤非字母数字(如需):
preg_replace('/[^a-zA-Z0-9]/', '', $s)
处理后再统计频次,避免误判。











