Задача 6277. Источник: Поляков. Задание КИМ 24
(Е. Фокин) Текстовый файл 24-252.txt состоит не более чем из 106 символов и содержит только буквы латинского алфавита и десятичные цифры. Найдите максимальную длину подстроки, ограниченной с двух сторон одним и тем же символом и не содержащей этого символа в середине. В ответе укажите сначала символ, ограничивающий строку, а затем без разделителей длину найденной строки, включая граничные символы. Если в строке есть несколько подходящих подстрок одинаковой длины, нужно указать символ, имеющий больший числовой код. Например, для строки ABCDABECD ответом будет D6.
Решение
Решение данной задачи возможно с использованием метода split. В данном способе обязательно нужно проверять, входят ли первая и последняя подстроки в анализируемые, т.е. начинается ли или заканчивается ли строка рассматриваемым символом.
Python через split
s = open('24-252.txt').readline()
mxc = ''
mx = 0
for c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ':
sl = s.split(c)
if s[0] != c:
del sl[0]
if s[-1] != c:
del sl[-1]
for i in sl:
if len(i) + 2 >= mx:
mxc = c
mx = len(i) + 2
print(mxc, mx, sep='')
PascalABC через split
var
max: Integer;
s, i: String;
sl: Array of String;
c, maxc: Char;
f: TEXT;
begin
Assign(f, '24-252.txt');
Reset(f);
Readln(f, s);
max := 0;
maxc := ' ';
foreach c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' do
begin
sl := s.Split(c);
if s[1] <> c then
sl := sl[1:];
if s[s.Length] <> c then
sl := sl[:sl.Length - 1];
foreach i in sl do
if i.Length + 2 > max then
begin
maxc := c;
max := i.Length + 2;
end;
end;
Writeln(maxc, max);
end.
Другим вариантом является использование метода поиска в строке find. Обрабатываем пары одинаковых символов и анализируем длину строки между ними.
Python через поиск
s = open('24-252.txt').readline()
mxc = ''
mx = 0
for c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ':
last = s.find(c)
current = s.find(c, last + 1)
while current != - 1:
if current - last + 1 >= mx:
mxc = c
mx = current - last + 1
last = current
current = s.find(c, last + 1)
print(mxc, mx, sep='')
PascalABC через поиск
var
max, last, current: Integer;
s: String;
c, maxc: Char;
f: TEXT;
begin
Assign(f, '24-252.txt');
Reset(f);
Readln(f, s);
max := 0;
maxc := ' ';
foreach c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' do
begin
last := s.IndexOf(c);
current := s.IndexOf(c, last + 1);
while current <> -1 do
begin
if current - last + 1 >= max then
begin
maxc :=c;
max := current - last + 1;
end;
last := current;
current := s.IndexOf(c, last + 1);
end;
end;
Writeln(maxc, max);
end.
C++ через поиск
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-252.txt");
string s;
char sym[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
f >> s;
int max = 0;
char maxc = ' ';
for (char* c = sym; *c != 0; c++)
{
int last = s.find(*c);
int current = s.find(*c, last + 1);
while (current != -1)
{
if (current - last + 1 >= max)
{
maxc = *c;
max = current - last + 1;
}
last = current;
current = s.find(*c, last + 1);
}
}
cout << maxc << max << endl;
}
Ответ
D9747