zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    最简单的UDP程序
    最简单的TCP程序
    一道面试题的分析
    JDK5新特性:可变参数方法
    文件IO流总结
    集合使用的总结
    双列集合Map的嵌套遍历
    集合HashSet的使用
    集合TreeSet的使用
    用LinkedList模拟Stack功能
  • 原文地址:https://www.cnblogs.com/flix/p/12885284.html
Copyright © 2011-2022 走看看