程序員面試金典——面試題01.04.迴文排列

一、題目介紹

給定一個字符串,編寫一個函數判定其是否爲某個迴文串的排列之一。

迴文串是指正反兩個方向都一樣的單詞或短語。排列是指字母的重新排列。

迴文串不一定是字典當中的單詞。

 

示例1:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/palindrome-permutation-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

二、解題思路

       如果一個字符串能夠通過重新排列得到一個迴文串,那麼該字符串應具有以下特性:字符串中最多只能有一個字符出現的次數爲奇數次。bitset有一個成員函數爲flip,其功能爲反轉所有位,或者指定的位

  • 創建長度爲128的bitset對象bt,因爲標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制爲0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。
  • 遍歷字符串中的每個字符,並反轉該字符所對應的位。(即0變1,或1變0)。
  • 統計bt中1的個數,如果爲1則證明只有一個字符出現的次數爲奇數次,如果爲0則證明每個字符出現的次數爲偶數次。

三、解題代碼

class Solution {
public:
    bool canPermutePalindrome(string s) {
        //標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制爲0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。
        bitset<128> bt;
        for(int i = 0; i < s.size(); ++i)
        {
            bt.flip(s[i]); //反轉所有位,或者指定的位。
        }
        return bt.none() || bt.count() == 1;
    }
};

四、解題代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章