シリーズは、すべての単語は、サブストリング。文字列sと同じ言葉のいくつかのワード長与えられた質問を意図しています。サブストリングの開始位置が正確に言葉シリーズのフォーム内のすべての単語に形成することができる検索。まさに言葉に言葉に部分文字列と一致していることを注意、そこに介在他の文字はありませんが、言葉一連の単語の順序を考慮する必要はありません。例、
例1:
入力: S = "barfoothefoobarman"、 言葉= [ "FOO"、 "バー"] 出力:[0,9]
説明:インデックス0及び9から始まるサブストリングは、それぞれ"barfoo"および"foobarに"です。 出力順は、[9.0]が細かすぎる戻って、問題ではありません。例2:
入力: S = "wordgoodgoodgoodbestword"、 言葉= [ "単語"、 "良い"、 "最高"、 "言葉"] 出力:[]
アイデアはなく、テンプレートを適用する前に、(スライディングウィンドウ)スライディングウィンドウです。各ワードは、同じ長さである言葉、条件を指定して、この問題は、この条件は、対象を簡単にすることに注意してください。最初の言葉の中にすべての単語をハッシュマップを作成し、発生回数が記録されています。文字列s、すべての動きの文字を横断開始ここでの考え方は、私ハッシュマップの最初からサブストリングを検索する必要がすべての単語が内部(その数)を保持含まれているので、次に、ハッシュマップの前にいったんコピーする必要があります。必要性が部分文字列がまだハッシュマップ年であるかどうかを判断するとき、それは部分文字列を見つけた場合は、部分文字列が存在しない場合、またはブレークの0となっている場合の回数は、部分文字列を説明するための開始点として、電流iが有効ではありません。このサブストリングが存在する場合ワード数がKを有するが、 - - ハッシュマップ内のすべての単語が上トラバースされるときK == 0を知ることができる場合、そう、これは私が結果セットを追加したサブストリングの開始位置させることができます。
時間はO(n ^ 2)
スペースO(n)は、
Java実装
1 クラスソリューション{ 2 公共一覧<整数> findSubstring(文字列の文字列[]語){ 3 // コーナーケース 4 もし(S == NULL ||単語== NULL || words.length == 0 ){ 5 返す 新しいのArrayListを<> (); 6 } 7 8 // 通常の場合 9 リスト<整数> RES = 新規のArrayList <> (); 10 INT N = words.length。 11 INT M =言葉[0] .LENGTH()。 12 のHashMap <文字列、整数>マップ= 新しい HashMapの<> (); 13 のために(文字列str:ワード){ 14 map.put(STR、map.getOrDefault(STR、0)+ 1 )。 15 } 16 17 のために(INT I = 0; I <= s.length() - N * M; I ++ ){ 18 のHashMap <文字列、整数>コピー= 新規 HashMapの<> (マップ) 19 int型 K = N; 20 のint jは= 私を。 21 一方(K> 0 ){ 22 文字列str = s.substring(J、J + M)。 23 であれば(!copy.containsKey(STR)|| copy.get(STR)<1 ){ 24 ブレーク。 25 } 26 copy.put(STR、copy.get(STR) - 1 )。 27 k-- ; 28 J + = M。 29 } 30 であれば(K == 0 ){ 31 res.add(I)。 32 } 33 } 34の リターンRES。 35 } 36 }
JavaScript実装
1 / * * 2 * @param {文字列} S 3 * @param {ストリング[]}ワードは 4 * @return {数[]} 5 * / 6 VAR findSubstring = 関数(S、単語){ 7 // コーナーケース 8 もし(S == NULL ||単語== NULL || words.length == 0 ){ 9 リターン[]。 10 } 11の 12 // 通常のケース 13 のlet RES = []; 14 LET N = words.length。 15 M =言葉を聞かせて[0 ] .LENGTH。 16 LETマップ= {}; 17 のための(単語のSTRを聞かせて){ 18 1 +地図[STR] =([STR] || 0地図)。 19 } 20 21 のための(I = 0せ; I <= s.length - N * M; I ++ ){ 22 LETコピー= {...地図}。 図23は、 Kせ= N。 24 LET jは= 私を。 25 一方(K> 0 ){ 26 LET STR = s.substring(J、J + M)。 27 であれば(!コピー[STR] ||コピー[STR] <1 ){ 28 ブレーク; 29 } 30 コピー[STR] - 。 31 k-- 。 32 J + = M。 33 } 34 であれば(K == 0 ){ 35 res.push(I)。 36 } 37 } 38の リターンRES。 39 }。