for(int i = 0; i < s.length() - k + 1;i++)
В этой строке мы гарантируем, что 'i' не будет go по всей длине строки, что приведет к исключению IndexOutOfBounds.
Например, в следующем фрагменте кода Обратите внимание, что внутри для l oop мы обращаемся к индексу i + 1, поэтому условие в for l oop записывается как 'i for(int i = 0; i < s.length() - 1; i++){
if(s.charAt(i+1) == s.charAt(i){
...
...
}
}
Переменная' i 'перемещается от индекса 0 к s.length () - 1, когда для l oop это примерно так:
for(int i = 0; i < s.length(); i++)
Переменная 'i' переместится из индекса 0 в s.length () - k, когда для l oop будет выглядеть так:
for(int i = 0; i < s.length()-k; i++)
Но так как мы используем подстроку функция и в этой функции, индекс окончания не включен, мы добавляем 1 в for для l oop:
for(int i = 0; i < s.length()-k+1; i++)
Надеюсь, я очистил ваши сомнения. Не пугайтесь этого длинного объяснения и не торопитесь, чтобы понять, что я пытался передать.