【エッジブラシ問題】回文配列-BitSet実現
9520 ワード
ソース
916.回文配列
タイトルの簡単な説明
文字列を指定して、文字列に配列があるかどうかを判断します.
サンプル
サンプル1
サンプル2
サンプル3
もんだいぶんせき
この問題の質問は文字列を与えて、文字列の中のバイトのすべての文字は1つの回文の配列を構成することができますか?まず、回文の配列はどのようなものなのか、私たちは2つの状況に分けることができます.文字列の長さが偶数である場合、各文字に偶数回現れるだけで、エコー配列を構成することができます. 文字列の長さが奇数である場合、奇数回は1文字しか存在せず、残りの文字は偶数回でなければならない.
では、文字列の各文字が現れる回数を計算し、奇数回が現れる文字の個数を判断するには、個数<2だけで、長い間問題を満たすことができます.
コーディング実装
しかし,コードがこのように煩雑なのは,主に自分の認識するツールが不足しているためである.問題解を検索するときに以下の解題方法が発見されたので、コードは非常に簡潔であるため、ここでは皆さんにお勧めします.
BitSetについて
916.回文配列
タイトルの簡単な説明
文字列を指定して、文字列に配列があるかどうかを判断します.
サンプル
サンプル1
: s = "code"
: False
:
サンプル2
: s = "aab"
: True
:
"aab" --> "aba"
サンプル3
: s = "carerac"
: True
:
"carerac" --> "carerac"
もんだいぶんせき
この問題の質問は文字列を与えて、文字列の中のバイトのすべての文字は1つの回文の配列を構成することができますか?まず、回文の配列はどのようなものなのか、私たちは2つの状況に分けることができます.
では、文字列の各文字が現れる回数を計算し、奇数回が現れる文字の個数を判断するには、個数<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について
( )