Обновление Java 8 с O (n) сложностью по времени (и только 1 строкой):
int maxLength = Arrays.stream(bitStr.split("0+"))
.mapToInt(String::length)
.max().orElse(0);
См. живая демонстрация .
Это также автоматически обрабатывает пустой ввод, возвращая 0
в этом случае.
Java 7 компактное решение, но O (n log n) сложность времени:
Пусть API Java сделает всю работу за вас всего за 3 строки:
String bits = "100011101100111110011100";
LinkedList<String> list = new LinkedList<String>(Arrays.asList(bits.split("0+")));
Collections.sort(list);
int maxLength = list.getLast().length(); // 5 for the example given
Как это работает:
bits.split("0+")
разбивает входные данные на String[]
с каждой непрерывной цепочкой из 1 (разделенных всеми нулями - регулярное выражение для этого 0+
) становится элементом массива Arrays.asList()
превращает String[]
в List<String>
- Создание и заполнение нового
LinkedList
из только что созданного списка - Использование коллекций для сортировки списка.Самая длинная цепочка из 1 будет сортироваться последней
- Получить длину последнего элемента (самого длинного) в списке.Вот почему был выбран
LinkedList
- у него есть метод getLast()
, который, как мне показалось, был удобен
Для тех, кто считает, что это "слишком тяжело", с учетом входных данных образцаНа моем MacBook Pro потребовалось менее 1 мс.Если длина входной строки не превышает гигабайт, этот код будет выполняться очень быстро.
EDITED
Предложенный Максом использование Arrays.sort()
очень похоже и выполняется в два раза быстрее, но все равно требует 3строки:
String[] split = bits.split("0+");
Arrays.sort(split);
int maxLength = split[split.length - 1].length();