ここでは、ライトカスタムディレクトリのタイトル
文字列の配列LeetCode567
タイトル説明は
s1と配置され含まれていS2に決定するために二つの文字列s1とs2、書き込み機能を与えられました。
換言すれば、第一の配列の一つは2番目の文字列の文字列の部分文字列です。
例1:
入力:S1 = "AB"、S2 = "eidbaooo"
出力:真の
説明:( "BA")のうちの1つを含む、S2、S1の配置を。
例2:
入力:S1 = "AB"、S2 = "eidboaoo"
出力:偽
注:
入力文字列が小文字のみを含んでいる
2つの文字列の間の長さは、[1は、10,000]
トップ
タイトルの分析
1.この質問は、私たちはスライディングウィンドウアルゴリズムを使用して、アイデアは一般的に、これは次のとおりです。
まず、文字列の可能性は、S1階乗その長さに配置されるべき文字列の長さが10000であり得るので、全ての配置がそう見つけることです。我々は興味の形で配置されていないアイデアを、変換することができ、そのようなAABなどの配置関係における要素の数は、その後、関係の数に換算長さS1が3であるので、我々ように、{1:2、B}ウィンドウの長さはまた、我々は発生数とS2の行のウィンドウが2である見つけるそうであれば、3であり、Bは、次いで、S2、S1が構成に含まれるものです。
2.スライディングウィンドウああとは何ですか?
アレイ内のウィンドウは、E iは〜であるように、ここでスコープとして、範囲への注力を表し、
タイムリーな平均スライディング、このウィンドウは移動しますが、同じの窓の大きさは、そのようなこの時間の右側のスライドのように、電子の意志左、dが追加されます。
3.再度、質問を理解するために来ますか?
我々は、配置の形態に関係ない、と言うが、このようなAABなどの配置関係における要素の数は、その後、関係の数に換算長さS1は、我々の窓ので、3であるため、{1:2、B}長さはまた、我々は発生数とS2の行のウィンドウが2である見つけるそうであれば、3であり、Bは、次いで、S2、S1が構成に含まれるものです。同じように、この質問に変更します。
```java
public class LeetCode567 {
public boolean checkInclusion(String s1, String s2) {
//l1是窗口长度
int l1 = s1.length();
int l2 = s2.length();
int[] arr1 = new int[26];
int[] arr2 = new int[26];
for (char c : s1.toCharArray()) {
arr1[c - 'a']++;
}
//滑动l2,字符串,窗口内的字符串,放到数组里,对比两个数组是否相等,相等包含,不相等,不包含
for (int i = 0; i < l2; i++) {
if (i >= l1) {
//i-l1 左窗口指针
--arr2[s2.charAt(i - l1) - 'a'];
}
arr2[s2.charAt(i) - 'a']++;
if (Arrays.equals(arr1, arr2))
return true;
}
return false;
}
}