LCR 015. 文字列内のすべてのアナグラムを検索する
問題解決のアイデア
- スライディング ウィンドウは、条件を満たすすべての左側の境界を検索します。
- 2 つのマップを作成します。1 つは実際に必要な有効な文字を記録するもので、もう 1 つはウィンドウ内の有効な文字の数を記録するものです。
- 初期化が必要です
- 文字をトラバースするたびに、それが有効な文字であるかどうかが判断され、ウィンドウが更新された場合には、ウィンドウ内の有効な文字数が必要な有効な文字数と等しいかどうかも判断されます。有効に更新されました
- ウィンドウ長が大きすぎる場合は、境界を縮小して左側のウィンドウ内の文字が有効文字かどうかを判定し、ウィンドウを更新して有効にする必要があります。
- すべての左マージンを記録する
- それから戻ります
class Solution {
public List<Integer> findAnagrams(String s, String p) {
Map<Character,Integer> need = new HashMap<>();
Map<Character,Integer> window = new HashMap<>();
for(int i = 0; i< p.length(); i++){
char c = p.charAt(i);
need.put(c,need.getOrDefault(c,0) + 1);
}
int left = 0;
int right = 0;
int valid = 0;
List<Integer> res = new ArrayList<>();
while(right < s.length()){
char c = s.charAt(right);
right++;
if(need.containsKey(c)){
window.put(c,window.getOrDefault(c,0) + 1);
if(window.get(c).equals(need.get(c))){
valid++;
}
}
while(right - left >= p.length()){
if(valid == need.size()){
res.add(left);
}
char d = s.charAt(left);
left++;
if(need.containsKey(d)){
if(window.get(d).equals(need.get(d))){
valid--;
}
window.put(d,window.get(d) - 1);
}
}
}
return res;
}
}