一、題目介紹
給定一個字符串,編寫一個函數判定其是否爲某個迴文串的排列之一。
迴文串是指正反兩個方向都一樣的單詞或短語。排列是指字母的重新排列。
迴文串不一定是字典當中的單詞。
示例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;
}
};