問題文
二つの文字列が与えられ 、S と T彼らは同型であれば、判断します。
内の文字場合、2つの文字列が同型で sが 取得するために交換することができます トンを。
文字の順序を維持しながら、文字のすべてのオカレンスは、別の文字に置き換える必要があります。どの2つの文字は、同じ文字にマッピングしないかもしれませんが、文字はそれ自体にマッピングすることができます。
例1:
入力:S = "egg",
T = "add"
出力:真
例2:
入力:S = "foo",
T = "bar"
出力:偽
例3:
入力:S = "paper",
T = "title"
出力:真
注意:
あなたは、両方取ることができる のを と tは 同じ長さを有しています。
問題のリンク
ビデオチュートリアル
あなたはここに詳細なビデオチュートリアルを見つけることができます
- ユーチューブ
- 駅B
思考プロセス
非常によく似て比較的簡単な問題、Wordのパターン。私たちがしなければならないのは、文字列から文字列bに1つのマッピングに1をチェックしている、また、それは(には二つの異なる文字がBで同じ文字にマッピングしてはならないという意味)の全単射マッピングを維持する必要があります
全単射マッピングを使用します
aとbのいずれかによって文字1を確認してください。前に見られていないのcharであれば、そう以降で、この文字の間に1対1のマッピングとBのcharを作成し、この文字が再び見られた場合、それは我々がfalseを返す他に、bにマッピングする必要があります。また、Bのcharは、別の文字によってマップされることはありませんを確認する必要があります。
動画int型説明 |
ソリューション
1つの 公共 ブールisIsomorphic(文字列、列B){ 2 であれば(==のヌル || B == NULL || a.length()=!てb.length()){ 3 リターン 偽。 4 } 5 地図<文字、キャラクタ>ルックアップ= 新規 HashMapの<> (); 6 セット<文字> dupSet = 新しい HashSetの<> (); 7 8 のための(int型 ; iが(a.lengthを<)I ++は、I = 0 ){ 9 チャー C1 = a.charAt(I)。 10 文字C2 = b.charAt(I)。 11 12 であれば(lookup.containsKey(C1)){ 13 であれば(C2 =!lookup.get(C1)){ 14 リターン 偽。 15 } 16 } 他{ 17 lookup.put(C1、C2)。 18 // 同じC2に異なるれるC1sマップを防止するために、このことは、全単射写像でなければならない 19 場合(dupSet.contains(C2)){ 20 リターン 偽。 21 } 22 dupSet.add(C2)。 23 } 24 } 25 リターン 真。 26 }
時間複雑:O(N)は、Nは列Aまたは文字列Bの長さであります
スペース複雑さ:O(N)、Nはハッシュマップので、文字列aまたは文字列Bの長さであり、我々が使用する設定します