これは、喜びと喜びの最初の本である344、最初の更新368ピアンオリジナル
01の質問と準備ができて見えます
今日導入さLeetCode
における演算問題Easy
最初のレベル209
(全体のタイトル番号がタイトル893
)。
あなたは、文字列の配列Aを与えられています 。
移動の任意の数、S == T.後の場合、2つのストリングSとTは特殊等価です
この動きは、I%2 == J%2でi及びj 2つのインデックスを選択し、S [J]と[i]はSをスワップから成ります。
今、Aから特殊相当ストリングのグループがないSに任意の文字列がSで任意の文字列を有する特殊な等価ないようの空でない部分集合Sであります
A.からの特別な等価文字列のグループの数を返します。
文字列の配列Aを考えます
モバイル、二つの文字列のSとTの任意の数の後の場合は等しい特別ですS == T
。
これは、ここで2つの移動指数iおよびjは、選択を指しi%2 == j%2
、そしてによりS[j]
交換S[i]
。
すなわち、Sが存在しない(ただし、A中に存在する)に任意の文字列、Sは等しく特別ではない任意の文字列であるので、今、ストリングSは、特別なグループに等しく、Aは、非空集合です。
同じ番号の文字列の特殊なグループを返します。例えば:
入力:[ "A"、 "B "、 "C"、 "A"、 "C"、 "C"]
出力:3
説明:3グループ[ "A"、 "" ]、[ "B"]、 [ "C"、 "C" 、 "C"]
入力:[ "AA"、 "BB "、 "AB"、 "BA"]
出力:4
説明:4グループ[ "AA"]、[ " BB"]、[ "AB"]、[ "BA"]
入力:[ "ABC"、 "ACB "、 "BAC"、 "BCA"、 "タクシー"、 "CBA"]
出力:3
説明:3グループ[ "ABC"、 "CBA" ]、[ "ACB"、 " BCA "]、[" BAC ""タクシー「]
入力:[ "ABCD"、 "CDAB" 、 "ADCB"、 "CBAD"]
出力:1
:1グループ[ "ABCD"、 "CDAB" 、 "ADCB"、 "CBAD"]
注意:
1 <= A.length <= 1000
1 <= A [i]が.LENGTH <= 20
全ての[i]は、同じ長さを有しています。
すべてのA [i]は小文字のみが含まれています。
問題を理解する02
この質問のタイトルを初めて目に記述無知な力を見るために見ている、それが何を意味するのか表現するために、おろかな問題を解決する方法がわかりません。
のみ与えられ、その4つの例で、最終的にはそれの意味が言いたい理解して何回、覚えていない読んで、弾丸をかむと読むことができ、中国は、上記の私はGoogleで翻訳に基づいて何をすべきかですポリッシュ、理解しやすく、何も、人々が直接英語の説明を見ることができない、あなたは人生の不思議を見ることができます!
トピックその二つの文字列のSとJは、文字の任意の交換することができますが、前提がありi%2 == j%2
、それが唯一の奇数ビットSと奇数ビットの変更は、のみでも同様にSと偶数ビット交換、交流Jビットと言うことです、 JはSに等しく、変更の完了後に等しい特別の場合。
今、私たちは同じである、上記変換規則に沿った小さなギャングのこれらの特別な文字列、小さな文字列内の各ギャングの等しいされた文字列の特殊なグループの概念を持っています。Q A、どのように多くのような小さなギャング?
4つの結合の点では例、そしてすぐに話題は神の馬の意味が何であるかを理解するだろう。
第四の例、A = [“abcd”,“cdab”,“adcb”,“cbad”]
そして最終的に出力が1に設定された特別な文字列の数に等しいが、のはこの1つがアウトカウントする方法を見てみましょう。
〜第"abcd"
一変換'a'
、'c'
交換可能'b'
、'd'
交換可能、被験者が変換の完了になった後に関わらずための、我々は、昇順で統一されていることを意味し、任意のスワップを言われているので"ac" + "bd"="acbd"
。
このロジックに続き、"cdab"
、"adcb"
、"cbad"
変換後に、なっています"acbd"
最終的には一つだけのギャングがあるように、それはあります"acbd"
。
03第一溶液
各個々の文字列の処理は、26ビット長使用する場合int
、別途、奇数ビットに発生する各文字の数を記録し、偶数次元アレイを、次いで、一緒にスプライス二つの文字列の新しい配列に移し、預金はHashSet
、最後の特別なグループの数は、文字列に等しいHashSet
のsize
。
public int numSpecialEquivGroups(String[] A) {
Set<String> set = new HashSet<String>();
for (String str : A) {
int[] odd = new int[26];
int[] even = new int[26];
for (int i=0; i<str.length(); i++) {
if (i%2 == 0) {
even[str.charAt(i)-'a']++;
} else {
odd[str.charAt(i)-'a']++;
}
}
String newStr = Arrays.toString(odd)+Arrays.toString(even);
set.add(newStr);
}
return set.size();
}
04第二の溶液
村の後半は、格納され、最後の文字列に、偶数ビット、奇数ビットをメモリの最初の半分を、我々はさらに、上記つのみint配列に溶液を最適化することができるが、長さが52となるHashSet
等しい最後の特殊文字に文字列の数であるHashSet
のsize
。
public int numSpecialEquivGroups2(String[] A) {
Set<String> set = new HashSet<String>();
for (String str : A) {
int[] count = new int[52];
for (int i=0; i<str.length(); i++) {
count[str.charAt(i)-'a'+26*(i%2)]++;
}
set.add(Arrays.toString(count));
}
return set.size();
}
05まとめ
テーマ別アルゴリズムが連続しているより半年以上日間、特集記事のアルゴリズム212件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造の記事コレクションのシリーズを得るために、キーワードのいずれか] 。
それは、すべてだあなたは何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは以下のコメントを交換することができ、親指、メッセージ転送およびサポートは、私にとっての最大の報酬です!