leetcode-回文排列

题目

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

示例1:

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

思路

首先判断回文排列,可以想象就是哈希表。如果为回文的重排列,那么我们首先判断字符串是奇数还是偶数

  1. 奇数:如果字符串是奇数,那么我们可以将字符串映射到哈希表中,将哈希表中是0的略过,偶数次也略过,因为这些可以构成回文串,问题是出现奇数次的字符,只能有一个,比如说’a’出现了3次或者5次,都可以,没问题,‘a’搭配其他出现偶数次的字符都可以构成回文串,但是不能既有出现3次的’a’和出现3次的’b’,这就歇逼了。
  2. 偶数:如果字符串是偶数,那么我们可以将字符串映射到哈希表中,将哈希表是0的略过,偶数次也略过,不同的是,不能出现奇数次出现的字符,比如说出现了3次的’a’,因为出现奇数次次数的字符不能再放在字符串中间了。所以遍历哈希表,只有有出现奇数次的字符,就返回false,遍历完也没有,就返回true。
bool canPermutePalindrome(char* s){
    int len=strlen(s);
    int map[128];
    for(int i=0;i<128;i++){
        map[i]=0;
    }
    for(int i=0;i<len;i++){
        map[s[i]]++;
    }
    int OddCount=0;     //奇数个数
    int EvenCount=0;    //偶数个数
    if(len%2){
        for(int i=0;i<128;i++){
            if(map[i]==0)
                ;
            else if(map[i]%2){      //出现次数如果是奇数
                OddCount++;         //奇数++
            }
            else{                   //出现次数如果是偶数
                EvenCount++;        //偶数++
            }
        }
        if(OddCount>1){
            return false;
        }
        return true;
    }
    if(len%2==0){
        for(int i=0;i<128;i++){
            if(map[i]==0)
                ;
            else if(map[i]%2)
                return false;
            else
                ;
        }
    }
    return true;
}

你可能感兴趣的:(leetcode)