Я решаю задачу LeetCode 76 по подстроке минимального окна. Я обнаружил что-то очень странное.
Описание задачи:
Для заданных строк s и t найти минимальное окно в s, которое будет содержать все символы из t.
Тестовый пример:
- s = "ADOBECODEBANC"
- t = "ABC"
- Ожидаемый результат: «BANC»
- Когда я использую алгоритм скользящего окна БЕЗ проверки необходимости[c] > 0, он правильно возвращает «BANC».
- Когда я добавляю условие «if (need[c] > 0)», он возвращает «ADOBEC», который неправильно.
- Для символов, отличных от t, нужно[c] == 0
- Эти символы никогда не влияют на num или maxnum
- Поэтому пропуск ne[c]++ для них ничего не изменит
Я проверил это как на локальной Java, так и на LeetCode, и оба показывают один и тот же неверный результат с необходимостью[c] > 0.
Вот соответствующий раздел кода с проверкой необходимости[c] > 0:
while (right < y.length) {
char c = y[right];
right++;
if (need[c] > 0) {
ne[c]++;
if (ne[c] == need[c]) {
num++;
}
}
while (num == maxnum) {
if (right - left < finum) {
finum = right - left;
minleft = left;
}
char mm = y[left];
if (ne[mm] == need[mm]) {
num--;
}
ne[mm]--;
left++;
}
}