Условие: Текстовый файл состоит из символов, обозначающих прописные буквы латинского алфавита.
Определите максимальное количество идущих подряд символов, среди которых никакие две буквы из набора букв N, O и P (с учетом повторений) не записаны подряд.
Файл здесь:
https://kompege.ru/task?id=8510 Код писал на java, но логику я поясню:
Scanner scanner = new Scanner(System.in); //объявление сканера
String s = scanner.nextLine();//на java проще ввести строку через сканер, чем открывать через файл
int l = 0;//в этой переменной хранится длина текущей строки
int max = 0;//в этой переменной хранится максимальная длина строки
int flag = 0;//эта переменная является своеобразным маячком(флагом), далее по коды её значение раскроется
for (int i = 0; i < s.length(); i++) {//перебираем каждый элемент строки
if(s.charAt(i)=='N' | s.charAt(i)=='O' | s.charAt(i)=='P'){//если элемент с индексом i один из набора (N,0,P)
if(flag==1){//если флаг поднят, значит символ из набора встретился нам второй раз подряд
if(max<l)//если длина текущей строки превысила максимальную
max = l;//запишем значение текущей строки в максимальную
l=1;//длина текущей строки сбрасывается до одного элемента
}else{/если флаг не поднят, значит символ из набора встретился нам один раз, соседний символ не из набора
l++;//длина текущей строки увеличивается на один
flag = 1;//флаг поднимается, если следующий символ окажется из набора, нам придётся оборвать текущую строку
}
}else {//символ не из набора
l++;//увеличиваем текущую длину строки
flag = 0;//нет поводов поднимать флаг, если он был поднят прежде, его нужно опустить
}
}
System.out.println(max);//выводим на экран максимальное значение.
К коду можно придраться, потому что я проверяю максимальное значение только, когда обрубаю строку, если max длина будет в самом конце, программа её не считает. Однако, открыв файл и перемотав в конец, видно, что строка оканчивается на "PO", поэтому программа проверяет на max там где нужно.(в принципе, можно везде проверку на max поставить, ответ не изменится). Если запустить код, то получится ответ 50 при правильном 57. Помогите найти ошибку!