Боюсь, не совсем близко. В основном этот код проверяет, есть ли в двух строках два символа в одинаковых позициях в любой точке, и, если это так, возвращает индекс второго из этих символов. Например, если _str
это "abcdefg", а str
это "12cd45", вы вернете 3, потому что у них есть "cd" в том же месте, и это индекс "d". По крайней мере, это настолько близко, насколько я могу судить, что он на самом деле делает. Это потому, что вы индексируете в обе строки одну и ту же индексную переменную.
Чтобы переписать indexOf
, ища str
в _st
, вам нужно отсканировать _st
для поиска первого символа в str
, а затем проверить, совпадают ли остальные символы; если нет, поднимитесь вперед на одно место, откуда вы начали проверку, и продолжите сканирование. (Есть оптимизация, которую вы можете выполнить, но в этом суть.) Так, например, если вы найдете первый символ str
в индексе 4 в _st
и str
длиной шесть символов, найдя первый символ, который нужно увидеть, если остальные пять (str
индексы 1-5 включительно) соответствуют _st
индексам 5-10 включительно (проще всего проверить все шесть символов str
на подстроке _st
начиная с 4 и заканчивая шестью символами). Если все совпадает, верните индекс, по которому вы нашли первый символ (так, 4 в этом примере). Вы можете остановить сканирование на _st.length() - str.length()
, поскольку, если вы не обнаружили, что оно запускается до этого момента, вы вообще его не найдете.
Боковая точка: не вызывайте функцию length
в каждом цикле. JIT может быть в состоянии оптимизировать вызов, но если вы знаете, что _st
не изменится в ходе выполнения этой функции (и если вы этого не знаете, вам это потребуется) , возьмите length()
в местном и затем обратитесь к этому. И, конечно же, поскольку вы знаете, что можете остановиться раньше, чем length()
, вы будете использовать локальную систему, чтобы запомнить, где можно остановиться.