返回介绍

solution / 0200-0299 / 0266.Palindrome Permutation / README

发布于 2024-06-17 01:04:02 字数 3076 浏览 0 评论 0 收藏 0

266. 回文排列

English Version

题目描述

给你一个字符串 s ,如果该字符串的某个排列是 回文串 ,则返回 true ;否则,返回_ _false_ _。

 

示例 1:

输入:s = "code"
输出:false

示例 2:

输入:s = "aab"
输出:true

示例 3:

输入:s = "carerac"
输出:true

 

提示:

  • 1 <= s.length <= 5000
  • s 仅由小写英文字母组成

解法

方法一:数组

创建一个长度为 $26$ 的数组,统计每个字母出现的频率,至多有一个字符出现奇数次数即可。

时间复杂度 $O(n)$,空间复杂度 $O(|\Sigma|)$。其中 $n$ 是字符串的长度,而 $|\Sigma|$ 是字符集的大小,本题中字符集为小写字母,因此 $|\Sigma|=26$。

class Solution:
  def canPermutePalindrome(self, s: str) -> bool:
    return sum(v & 1 for v in Counter(s).values()) < 2
class Solution {
  public boolean canPermutePalindrome(String s) {
    int[] cnt = new int[26];
    for (char c : s.toCharArray()) {
      ++cnt[c - 'a'];
    }
    int odd = 0;
    for (int x : cnt) {
      odd += x & 1;
    }
    return odd < 2;
  }
}
class Solution {
public:
  bool canPermutePalindrome(string s) {
    vector<int> cnt(26);
    for (char& c : s) {
      ++cnt[c - 'a'];
    }
    int odd = 0;
    for (int x : cnt) {
      odd += x & 1;
    }
    return odd < 2;
  }
};
func canPermutePalindrome(s string) bool {
  cnt := [26]int{}
  for _, c := range s {
    cnt[c-'a']++
  }
  odd := 0
  for _, x := range cnt {
    odd += x & 1
  }
  return odd < 2
}
function canPermutePalindrome(s: string): boolean {
  const cnt: number[] = new Array(26).fill(0);
  for (const c of s) {
    ++cnt[c.charCodeAt(0) - 97];
  }
  return cnt.filter(c => c % 2 === 1).length < 2;
}
/**
 * @param {string} s
 * @return {boolean}
 */
var canPermutePalindrome = function (s) {
  const cnt = new Array(26).fill(0);
  for (const c of s) {
    ++cnt[c.charCodeAt() - 'a'.charCodeAt()];
  }
  return cnt.filter(c => c % 2 === 1).length < 2;
};

方法二:哈希表

利用哈希表来维护元素。遍历字符串每个字母 $s[i]$,若 $s[i]$ 在哈希表中,则将 $s[i]$ 从哈希表中删除,否则将 $s[i]$ 加入哈希表。

遍历结束,若哈希表中元素个数不超过 $1$,则返回 $true$,否则返回 $false$。

时间复杂度 $O(n)$,空间复杂度 $O(|\Sigma|)$。其中 $n$ 是字符串的长度,而 $|\Sigma|$ 是字符集的大小,本题中字符集为小写字母,因此 $|\Sigma|=26$。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文