833検索文字列に置き換えます - 中

いくつかの文字列に  S、我々は新しいもの(必ずしも同じサイズ)と文字のグループを交換するいくつかの代替操作を実行します。

各交換作業が有する  3 開始インデックス:パラメータ  i、ソース単語  x とターゲット単語  yルールがあればということである  x 位置から始まり  i 、元の文字列では  S、我々はの発生置き換えます  x とします  yそうでない場合、我々は何もしません。

我々が持っている場合たとえば、  S = "abcd" 私たちはいくつかの交換作業を持っている  i = 2, x = "cd", y = "ffff"、そしてので  "cd" 位置から始まり  2 、元の文字列で  S、我々はと交換します  "ffff"

上の別の例を使用して  S = "abcd"、我々は交換作業の両方がある場合は、  i = 0, x = "ab", y = "eee"だけでなく、他の交換作業を  i = 2, x = "ec", y = "ffff"、この第2の動作があるため、元の文字列に何もしない  S[2] = 'c'一致しません、  x[0] = 'e'

これらのすべての操作が同時に発生します。交換のいずれかの重複がないことが保証だ:例えば、  S = "abc", indexes = [0, 1], sources = ["ab","bc"] 有効なテストケースではありません。

例1:

入力:S = "ABCD"、インデックス= [0,2]、ソース= [ "A"、 "CD"]、ターゲット= [ "EEE"、 "FFFF"] 
出力: "eeebffff" 
説明: ""開始S内のインデックス0で、それは「EEE」に置き換えられています。
「CDが」Sのインデックス2から始まり、それは「FFFF」に置き換えられています。

例2:

入力:S = "ABCD"、インデックス= [0,2]、ソース= [ "AB"、 "EC"]、ターゲット= [ "EEE"、 "FFFF"] 
出力: "eeecd" 
説明: "AB"開始S内のインデックス0で、それは「EEE」に置き換えられています。
「EC」は、元Sのインデックス2から開始していないので、私たちは何もしません。

ノート:

  1. 0 <= indexes.length = sources.length = targets.length <= 100
  2. 0 < indexes[i] < S.length <= 1000
  3. 与えられた入力のすべての文字は小文字です。

 

まずトラバーサルSは、対応する文字列インデックスかどうかに応じて、対応する文字列S源を見つけ、そしてもしそうであれば、ハッシュテーブルに格納されています

2.トラバースハッシュテーブル、最終的な出力を構築するために使用されるのStringBuilder

時間= O(N + M *のL)、N個の可能な置き換えの= S.length()、M =#、ターゲットのL =平均長さ

スペース= O(N)

クラスソリューション{
     パブリック文字列findReplaceString(文字列sは、int型[]のインデックス、文字列[]ソース、文字列[]ターゲット){ 
        地図 <整数、整数>マップ= 新しい HashMapの<> ();
        以下のためにint型 i = 0; iはindexes.length <; iは++ ){
             場合(S.startsWith(ソース[I]、インデックス[I])){ 
                map.put(インデックス[i]は、I)。
            } 
        } 
        
        StringBuilderのSB = 新規のStringBuilder();
        以下のためにint型 i = 0; iが< S.length()){
             もしを(map.containsKey(I)){ 
                sb.append(ターゲット[map.get(I)])。
                I + = 源[map.get(I)]の長さ()。
            } { 
                sb.append(S.charAt(I ++ ))。
            } 
        } 
        を返す)(sb.toStringします。
    } 
}

 

おすすめ

転載: www.cnblogs.com/fatttcat/p/11358141.html