Вы делали несколько вещей неправильно. Я исправил ваш код, хотя, возможно, есть более чистый способ сделать это. Ниже я объясню, что изменилось.
public static String plusOut(String str, String word)
{
String ret = "";
for (int i = 0; i < str.length(); ++i) {
int endIndex = i + word.length();
if (endIndex < str.length() + 1
&& str.substring(i, i + word.length()).equals(word)) {
ret += word;
i = i + word.length() - 1;
} else
ret += "+";
}
return ret;
}
Первая ошибка заключается в том, что вы не просматриваете весь контент str
и поэтому никогда не достигаете последнего символа str
.
Другая проблема заключается в том, что, найдя слово, вы не «переходите» к правильному следующему индексу в l oop, но продолжаете цикл по символам найденного слова, что приводит к дополнительным +
символов в вашей строке результата.
i = i + word.length() - 1;
В вашем решении приведенное выше приведёт вас к следующему индексу символа внутри str
, на который вы должны смотреть. Пример:
В строке 12xy34xyabcxy
ищите xy
.
Вы найдете, что слово xy
начинается с индекса 2
и заканчивается на 3
. В этот момент у вас есть строка результата ++xy
после добавления к ней найденного word
.
Теперь проблема начинается. Вы все еще в конечном итоге перебираете индекс 3
и добавляете дополнительные +
, потому что следующая пара символов не соответствует вашему слову.
2 символа после найденного xy
также добавьте +
, и у вас теперь есть ++xy+++
, что неверно.
endIndex < str.length() + 1
endIndex
назван в честь того, что это - конечный индекс вашей подстроки.
This check не позволяет нам проверять xy
, когда в строке недостаточно символов от текущего индекса до последнего, чтобы составить xy
, поэтому мы в итоге добавляем +
для каждого оставшегося символа.