【LeetCode-字符串/哈希表】回文排列

题目描述

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例:

输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)

题目链接: https://leetcode-cn.com/problems/palindrome-permutation-lcci/

思路

判断一个字符串其是否为某个回文串的排列之一,也就是判断该字符串是否能调整为回文串。如果一个字符串经过调整能变成回文串,那么统计该字符串中每个字符出现的次数,那么最多只会有 1 个字符的出现次数为奇数。例如,abab 能调整为回文串,ab 的出现次数均为偶数;ababc 能调整为回文串,只有一个字符 c 的出现次数为奇数;ababcd 不能调整为回文串,因为有 2 个字符 cd 的出现次数为奇数。所以,我们使用哈希表统计每个字符出现的次数,然后统计奇数的个数。如果奇数的个数小于等于 1,则能调整为回文串,返回 true,否则返回 false. 代码如下:

class Solution {
public:
    bool canPermutePalindrome(string s) {
        if(s.empty()) return true;

        vector<int> hash(256, 0);
        for(int i=0; i<s.length(); i++){
            hash[s[i]]++;
        }

        int oddNums = 0;
        for(int i=0; i<hash.size(); i++){
            if(hash[i]%2!=0) oddNums++;
        }

        if(oddNums>1) return false;
        else return true;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
原文地址:https://www.cnblogs.com/flix/p/12885284.html