leetcode
leetcode 2801 ~ 2850
回文排列

回文排列

难度:

标签:

题目描述

Given a string, write a function to check if it is a permutation of a palindrome. A palindrome is a word or phrase that is the same forwards and backwards. A permutation is a rearrangement of letters. The palindrome does not need to be limited to just dictionary words.

 

Example1:

Input: "tactcoa"
Output: true(permutations: "tacocat"、"atcocta", etc.)

 

代码结果

运行时间: 23 ms, 内存: 15.9 MB


/*
 思路:
 使用Java Stream API来判断一个字符串是否是某个回文串的排列之一。
 依然是检查字符的频率,但我们会用流操作来简化代码。
 我们将字符流映射为其频率,并检查频率为奇数的字符个数。
*/
import java.util.function.Function;
import java.util.stream.Collectors;

public class Solution {
    public boolean canPermutePalindrome(String s) {
        long oddCount = s.chars()
                          .mapToObj(c -> (char) c)
                          .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                          .values()
                          .stream()
                          .filter(count -> count % 2 != 0)
                          .count();
        return oddCount <= 1;
    }
}

解释

方法:

此题解通过使用哈希表记录字符串中每个字符出现的次数。然后遍历哈希表,统计有多少个字符出现奇数次。根据回文串的性质,一个字符串如果能够重排成回文串,那么最多只能有一个字符出现奇数次(位于回文中心)。如果超过一个字符出现奇数次,则不能形成回文串。因此,算法的核心是通过检查出现次数为奇数的字符的数量,来判断是否可能重排为回文串。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在此题解中,为什么使用哈希表而不是其他数据结构来统计字符的频率?
哈希表(或在Python中称为字典)提供了非常高效的键值对存储机制,允许快速插入、访问和更新操作,其平均时间复杂度为O(1)。这使得它非常适合用于统计字符频率,因为我们可以直接通过字符作为键快速定位到其频率计数。而其他数据结构如数组或列表则需要手动管理索引或进行额外的计算来达到同样的效果,通常效率较低。
🦆
题解中提到的奇数次出现的字符超过一次就返回False,这种判断方法是否考虑了所有字符都出现偶数次的情况?
是的,该判断方法已经考虑了所有字符都出现偶数次的情况。在遍历字典统计奇数次出现的字符数量的过程中,如果所有字符都是偶数次,那么`odd`变量将保持为0。因此,算法最终将返回True,正确地表示字符串可以重排成回文串。
🦆
哈希表中的`keys()`方法在Python中的效率如何?是否存在更优的方法直接检查或更新字典中的条目?
在Python中,字典的`keys()`方法返回一个视图对象,这个对象反映了字典键的实时视图,其访问效率很高。但在检查或更新字典条目时,使用`keys()`方法实际上是不必要的,因为可以直接使用`in`关键字检查键是否存在于字典中(例如`if i in dict`),这样更直接且效率更高。更新条目时,可以直接通过赋值操作来完成(例如`dict[i] = 1`),无需预先检查键是否存在。

相关问题