1.トピックの紹介
文字列が与えられたら、それがパリンドロームの順列の1つであるかどうかを判別する関数を記述します。
パリンドロームは、両方向が同じである単語またはフレーズです。配置とは、文字の再配置を指します。
パリンドロームは必ずしも辞書の単語ではありません。
例1:
入力:「tactcoa」
出力:true(「tacocat」、「atcocta」などで配置)
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/palindrome-permutation-lcci
。著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2つの問題解決のアイデア
文字列を再配置してパリンドローム文字列を取得できる場合、その文字列には次の特性が必要です。文字列には奇数回の文字の出現しかありません。ビットセットにはflipと呼ばれるメンバー関数があり、その関数はすべてのビットまたは指定されたビットを反転することです。
- 標準のASCIIコードは基本ASCIIコードとも呼ばれ、7ビットのバイナリ番号(残りの1ビットのバイナリは0)を使用してすべての大文字と小文字、0から9の数字、および句読点を表すため、長さ128のビットセットオブジェクトbtを作成します。 、およびアメリカ英語で使用される特別な制御文字。
- 文字列内の各文字をトラバースし、その文字に対応するビットを逆にします。(つまり、0が1になるか、1が0になります)。
- btの1の数を数えます。1の場合、1文字だけが奇数回出現することを証明します。0の場合、各文字が偶数回出現することを証明します。
3つの問題解決コード
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;
}
};