【エッジブラシ問題】回文配列-BitSet実現


ソース
916.回文配列
タイトルの簡単な説明
文字列を指定して、文字列に配列があるかどうかを判断します.
サンプル
サンプル1
  : s = "code"
  : False
  :
         

サンプル2
  : s = "aab"
  : True
  :
"aab" --> "aba"

サンプル3
  : s = "carerac"
  : True
  :
"carerac" --> "carerac"

もんだいぶんせき
この問題の質問は文字列を与えて、文字列の中のバイトのすべての文字は1つの回文の配列を構成することができますか?まず、回文の配列はどのようなものなのか、私たちは2つの状況に分けることができます.
  • 文字列の長さが偶数である場合、各文字に偶数回現れるだけで、エコー配列を構成することができます.
  • 文字列の長さが奇数である場合、奇数回は1文字しか存在せず、残りの文字は偶数回でなければならない.

  • では、文字列の各文字が現れる回数を計算し、奇数回が現れる文字の個数を判断するには、個数<2だけで、長い間問題を満たすことができます.
    コーディング実装
    private static boolean canPermutePalindrome(String s) {
        int len = s.length();
        int oddCount = 0;
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        for (int i = 0; i < len; i++) {
            if (null != map.get(s.charAt(i))){
                map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
                continue;
            }
            map.put(s.charAt(i), 1);
        }
        Set<Character> set = map.keySet();
        Iterator<Character> iterator = set.iterator();
        while (iterator.hasNext()){
            if (map.get(iterator.next()) % 2 == 1) oddCount++;
        }
        return oddCount > 2 ? false : true;
    } 
    

    しかし,コードがこのように煩雑なのは,主に自分の認識するツールが不足しているためである.問題解を検索するときに以下の解題方法が発見されたので、コードは非常に簡潔であるため、ここでは皆さんにお勧めします.
            
    public boolean canPermutePalindrome(String s) {
        BitSet bs = new BitSet();
        for (byte b : s.getBytes()) {
            //flip(int bitIndex):                  。
            bs.flip (b);
        }
        //cardinality():    BitSet      true    。
        return bs.cardinality() < 2;
    }
    

    BitSetについて
        (  )