いくつかの文字列に 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から開始していないので、私たちは何もしません。
ノート:
0 <= indexes.length = sources.length = targets.length <= 100
0 < indexes[i] < S.length <= 1000
- 与えられた入力のすべての文字は小文字です。
まずトラバーサル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します。 } }