` (strs[i].indexOf(prefix) != 0) ` в поиске LongestCommonPrefix

Я читал такое решение LongestCommonPrefix

Самый длинный общий префикс — LeetCode

` (strs[i].indexOf(prefix) != 0) ` в поиске LongestCommonPrefix

 public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) return "";
    String prefix = strs[0];
    for (int i = 1; i < strs.length; i++)
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length() - 1);
            if (prefix.isEmpty()) return "";
        }        
    return prefix;
}

Что касается while (strs[i].indexOf(prefix) != 0), если prefix не пусто, выражение будет постоянно возвращать True;

Как можно было сделать вывод, что prefix = prefix.substring(0, prefix.length() - 1);, я предполагал, что while (strs[i].indexOf(prefix) != 0) ничего не сделал.

"Что касается while (strs[i].indexOf(prefix) != 0), если префикс не пустой, выражение будет постоянно возвращать True" - нет, не будет, потому что prefix изменяется в теле цикла, и если он когда-либо пуст, код возвращается. Я не уверен, что вы спрашиваете здесь - не могли бы вы уточнить свой вопрос, пожалуйста?

Jon Skeet 09.04.2019 08:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
1 025
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Идея этого алгоритма такова:

  1. сначала предположим, что первое слово - это prefix, а затем мы проверим является ли prefix префиксом всех других слов.

  2. если strs[i].indexOf(prefix) != 0 означает, что это не начинается с prefix. Таким образом, мы должны немного сократить префикс (удалить последний символ), то есть: prefix = prefix.substring(0, prefix.length() - 1);

  3. мы постоянно делаем это, используя все проверенные слова или префикс был сокращен до '' (поэтому он и называется Horizontal scanning)

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)

лол, strs[i].indexOf(prefix) != 0 это not strs[i].startswith(prefix), сэкономьте часы на чтении документации по java.

Alice 09.04.2019 09:20

извините, я не объяснил это подробно. на самом деле это означает: если префикса нет в строке, он возвращает -1 или возвращает индекс. так что если strs[i].indexOf(prefix) != 0, это означает index ==-1 или index > 0, прямо противоположное startwith

recnac 09.04.2019 09:26

на самом деле у java есть startsWith api, можете попробовать это, я думаю тоже работает.

recnac 09.04.2019 09:27

Этот код в основном берет первую строку из списка строк

String prefix = strs[0];

И удаляет последний символ из этой строки

prefix = prefix.substring(0, prefix.length() - 1);

До следующей строки содержит эта подстрока.

while (strs[i].indexOf(prefix) != 0)

Это повторяется для каждой строки во входном массиве.

for (int i = 1; i < strs.length; i++)

Если алгоритм успешно проверил, что strs[i].indexOf(prefix) != 0 для каждой входной строки, prefix является самой длинной подстрокой, но не самым длинным общим префиксом.

Как вы уже упоминали в комментариях, вместо проверки strs[i].indexOf(prefix) != 0 вы должны использовать strs[i].startsWith(prefix) в качестве условия для цикла while. Таким образом вы должны получить общий приставка.

Другие вопросы по теме