LeetCode 1061辞書順最小の等価文字列

ここでのオリジナルタイトルリンク:https://leetcode.com/problems/lexicographically-smallest-equivalent-string/

トピック:

文字列を考える  A と、  B 同じ長さで、我々は[i]とB [i]は同等の文字であると言います。例えば、場合  A = "abc" と  B = "cde"、我々は持っています  'a' == 'c', 'b' == 'd', 'c' == 'e'

等価文字は任意の等価関係の通常の規則に従います。

  • 再帰性:「」==「」
  • 対称性: '' == 'B' が 'B' を意味== ''
  • 推移性: '' == 'B' と 'B' == 'c' は '' == 'C' を意味します

例えば、同値から情報を与えられた  A と  B 上記、  S = "eed"、  "acd"、及び  "aab" 等価文字列であり、  "aab" の辞書式に最小の等価文字列です  S

辞書順最小の同等の文字列を返します  S から同等の情報を使用して  A と  B

例1:

入力:A = 「パーカー」、B = 「モリス」、S = 「パーサ」
出力:「makkek」 で同等の情報に基づいて:説明AB、私たちすることができますグループとしての文字[m,p][a,o][k,r,s][e,i]各グループの文字が同等と辞書順にソートされています。だから、答えはあります"makkek"

例2:

入力:A = 「こんにちは」、B = 「世界」、S = 「保留」
出力:「HDLD」 説明:で同等の情報に基づいてをAしてB、我々はできるグループ自分のキャラクターをとして[h,w][d,e,o][l,r]だから、唯一の第二の手紙'o'Sに変更され'd'、答えがあります"hdld"

例3:

入力:A = 「leetcode」、B = 「プログラム」、S = 「ソースコード」
出力:「aauaaaaada」 説明:私たちは、グループ内の同等の文字ABなど[a,o,e,r,s,c][l,p][g,t]そして[d,m]、したがって、すべての文字Sを除く'u''d'に変換され'a'、答えです"aauaaaaada"

注意:

  1. 文字列  A、  B および  S からのみ小文字の英文字で構成されて  'a''z'
  2. 文字列の長さ  A、  B と  S の間である  1 と  1000
  3. 文字列  A と  B 同じ長さのものです。

ソリューション:

A及びBは、それぞれのインデックスに対して、Aに対応する文字等しく、Bは同組合でなければなりません。

ランクによって労働組合、労働組合を行うと。<Cは、Cの親です。

その後、Sの各文字のために、その祖先を見つけて、その結果に追加します。

時間複雑:O((M + n)が関数logm)。M = A.length()、N = S.length()。検索はO(関数logm)をとります。 

ランク別パス圧縮や労働組合、とamatorize O(1)。

スペース:O(M)。

ACのJava:

1  クラスソリューション{
 2      地図<文字、キャラクタ>親= 新規 HashMapの<> ();
3      
4      公共ストリングsmallestEquivalentString(列A、列B、列S){
 5          ためint型 ;)iはA.lengthを(<; I = 0 iは++ ){
 6              チャー A = A.charAt(I)。
7              チャー B = B.charAt(I)。
8              
9              もし(見つける(A)=!(B)を見つける){
 10                  組合を(B)
11              }
 12          }
 13          
14         StringBuilderのSB = 新しいStringBuilderの();
15          のためには、int型 i = 0; iはS.length()<; I ++のを){
 16              チャー ANC = 検索(S.charAt(I))。
17              sb.append(ANC)。
18          }
 19          
20          戻りsb.toString()。
21      }
 22      
23      プライベート チャー検索(チャーC){
 24          parent.putIfAbsent(C、C)。
25          であれば(C =!{parent.get(C))
 26              チャー ANC = 検索(parent.get(c)参照)。
27             parent.put(C、ANC)。
28          }
 29          
30          リターンparent.get(C);
31      }
 32      
33      プライベート ボイド組合(char型チャーB){
 34          チャー C1 = 見つける(A)
35          チャー C2 = 見つける(B)
36          であれば(C1 < C2){
 37              parent.put(C2、C1)。
38          } {
 39              parent.put(C1、C2)。
40          }
 41      }
 42 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/11297136.html