1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Что-то меня терзают сомнения, что это правильно, но все-таки потестируй на ВСЕХ своих тестах:
function maxChain(s: string; len: integer): integer; var i: integer; arr: array[1 .. 255] of byte;
begin for i := 1 to 255 do arr[i] := 255; arr[1] := 1; for i := 2 to length(s) do begin if pos(s[i], s) < i then arr[i] := arr[i - 1] else arr[i] := arr[i - 1] + 1; end;
i := 0; repeat inc(i) until arr[i + 1] > len;
maxChain := i; end;
var s: string; begin s := 'adeeadfcce'; writeln(maxChain(s, 4)); end.
Проснулся сегодня и понял, что в моём коде сортировка неправильная. Так лучше:
var s:string; i,j,m,ind,mnind,count:byte; sym:array [1..255] of byte; mn:array[1..255] of char;
function check(c:char):boolean; var u:byte; begin check:=false; for u:=1 to mnind do if c=mn[u] then begin check:=true; break; end; end;
begin writeln('Vvedite Stroku'); readln(s); writeln('Vvedite M'); readln(m); fillchar(sym,sizeof(byte)*length(s),0); fillchar(mn,sizeof(char)*length(s),#0); ind:=0;mnind:=0; for i:=1 to length(s) do begin if not(check(s[i])) then begin inc(ind);inc(mnind); for j:=1 to length(s) do if s[j]=s[i] then inc(sym[ind]); end; mn[mnind]:=s[i]; end; for i:=1 to ind-1 do begin for j:=i+1 to ind do begin if sym[i]>sym[j] then begin count:=sym[j]; sym[j]:=sym[i]; sym[i]:=count; end; end; end; count:=0; for i:=1 to m do begin inc(count,sym[ind]); dec(ind); end; writeln('Maxlength=',count); readln; end.
--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
var s:string; i,j,m,ind,mnind,count:byte; sym:array [1..255] of byte; //массив, в каждой ячейке которого содержится количество вхождений в строку //некого символа mn:array[1..255] of char; //массив, в котором хранятся уже посчитанные символы.
function check(c:char):boolean; //проверка символа на то, считали ли уже количество его вхождений в строку var u:byte; begin check:=false; for u:=1 to mnind do if c=mn[u] then begin check:=true; break; end; end;
begin writeln('Vvedite Stroku'); readln(s); writeln('Vvedite M'); readln(m); fillchar(sym,sizeof(byte)*length(s),0); // инициализация обоих массивов fillchar(mn,sizeof(char)*length(s),#0);// ind:=0;mnind:=0; //и переменных for i:=1 to length(s) do begin //бежим по строке if not(check(s[i])) then begin //если ещё не считали количество вхождений очередного элемента, то посчитаем inc(ind);inc(mnind); for j:=1 to length(s) do if s[j]=s[i] then inc(sym[ind]); //бежим по строке и считаем вхождения end; mn[mnind]:=s[i]; //заносим в массив элемент,вхождения которого считали, чтобы не считать их снова, если //он встретится опять end; for i:=1 to ind-1 do begin //в каждой ячейке массива sym содержится количество вхождений какого-то for j:=i+1 to ind do begin //элемента. Какого, нам не важно. Сортируем этот массив, "пузырьком". if sym[i]>sym[j] then begin count:=sym[j]; sym[j]:=sym[i]; sym[i]:=count; end; end; end; count:=0; for i:=1 to m do begin //отсортировали. Длины в массиве syn хранятся по возрастанию, нам надо взять inc(count,sym[ind]); // M самых больших. Идём с конца (заметь, чему равно ind здесь) и суммируем эти dec(ind); //элементы в count. end; writeln('Maxlength=',count); readln; end.
--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
я поняла почему 9. прото мне казалось, что символы должны подряд стоять... то есть Так aaaa bbbccccc ответ 8; А так aaaacccccbbb 9; А этого в самом задании не написано. Только то, что написала.
прото мне казалось, что символы должны подряд стоять...
Правильно казалось. Символы должны стоять именно подряд, это то, что записано в задании:
Цитата
которая вычисляет длину самой длинной m-знаковой строки, которая содержится в строке s.
Не "состоит из символов, из которых состоит s", а "содержится в s", понимаешь? Содержится - значит целиком: bca - содержится в abcabc, а bcb - уже нет...
Update Вот это:
function maxChain(s: string; len: integer): integer; var i, offset, max: integer; subs: string; begin max := 0; for i := 1 to length(s) do begin offset := 0; subs := ''; while (i + offset <= length(s)) do begin if pos(s[i + offset], subs) > 0 then inc(offset) else begin subs := subs + s[i + offset]; if length(subs) > len then break; inc(offset); end; end;
if max < offset then max := offset; end;
maxChain := max; end;
var s: string; begin s := 'aaaabbbccccc'; // m = 2; => 8 // s := 'adeeadfcce'; // m = 4; => 7 // s := 'accaeadad'; // m = 3; => 6 // s := 'aaaabbccccc'; // m = 1; => 5 writeln(maxChain(s, 2)); end.
выдает ожидаемые результаты на всех тестах, которые ты здесь приводила...
Правильно казалось. Символы должны стоять именно подряд, это то, что записано в задании: Не "состоит из символов, из которых состоит s", а "содержится в s", понимаешь? Содержится - значит целиком: bca - содержится в abcabc, а bcb - уже нет...
Искал наибольшее, что и требовалось... На каждой итерации в Offset получаем количество символов в M-буквенном слове, которое начинается с I-той позиции строки. Если среди всех Offset-ов найдем максимальный, то получим то, что требовалось в задаче: длину максимального М-буквеного слова.