Я читал такое решение LongestCommonPrefix
Самый длинный общий префикс — LeetCode
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)
ничего не сделал.
Идея этого алгоритма такова:
сначала предположим, что первое слово - это prefix
, а затем мы проверим
является ли prefix
префиксом всех других слов.
если strs[i].indexOf(prefix) != 0
означает, что это не начинается с prefix
.
Таким образом, мы должны немного сократить префикс (удалить последний
символ), то есть: prefix = prefix.substring(0, prefix.length() - 1);
мы постоянно делаем это, используя все проверенные слова или префикс
был сокращен до ''
(поэтому он и называется Horizontal scanning
)
Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)
лол, strs[i].indexOf(prefix) != 0
это not strs[i].startswith(prefix)
, сэкономьте часы на чтении документации по java.
извините, я не объяснил это подробно. на самом деле это означает: если префикса нет в строке, он возвращает -1 или возвращает индекс. так что если strs[i].indexOf(prefix) != 0
, это означает index ==-1
или index > 0
, прямо противоположное startwith
на самом деле у java есть startsWith
api, можете попробовать это, я думаю тоже работает.
Этот код в основном берет первую строку из списка строк
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. Таким образом вы должны получить общий приставка.
"Что касается while (strs[i].indexOf(prefix) != 0), если префикс не пустой, выражение будет постоянно возвращать True" - нет, не будет, потому что
prefix
изменяется в теле цикла, и если он когда-либо пуст, код возвращается. Я не уверен, что вы спрашиваете здесь - не могли бы вы уточнить свой вопрос, пожалуйста?