IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> поиск в строке, помигите найти ошибку
lopata
сообщение 20.03.2010 15:58
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Строка называется m-знаковой, если она содержит m различных знаков. Строки a, ab und abcbaac 3-знаковые, а строка abcd 4-знаковая.
Дана строка s и число m , так что 1 <= m <= Length(s).
Необходимо написать
FUNCTION MaxMChainLen(s: STRING, m: INTEGER): INTEGER;
которая вычисляет длину самой длинной m-знаковой строки, которая содержится в строке s.

Идея сама понятна. Начала с самого простого. Просто вычисляю самую первую m-знаковой подстроку, которая попадется. А потом, насколько понимаю, нужно делать по алгоритму Кнута-Морриса-Пратта.

Моя идея, что, начиная с первого знака строки s, я копирую этот каждый знак в строку subs. если новый знак строки s не содержиться в строке subs, то увеличиваю счетчик на единицу. и так до тех пор, пока счетчик не будет равен m. А потом просто вычисляю длину строки subs.

Походу я что-то там намутила с циклами.. Код компилируется, а ничего не выдается.
Гляньте, пожалуйста.


FUNCTION MaxMChainLen(s: STRING; m: INTEGER):INTEGER;
VAR
i,j, count: INTEGER;
subs : STRING;
BEGIN
count := 0;
subs := '';
WHILE (count <> m) DO BEGIN
FOR i := 1 to Length(s) DO BEGIN
IF ( i = 1) THEN BEGIN
subs := s[i];
count := count+1;
END (* if *)
ELSE BEGIN
FOR j := 1 to Length(subs) DO BEGIN
IF (s[i]<> subs[j]) THEN
count := count+1;
subs:= subs+s[i];
END; (* for *)
END; (* else *)
END; (* for *)
END;(* while *)
END; (* MaxMChainLen *)



Сообщение отредактировано: lopata - 20.03.2010 16:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Unconnected
сообщение 21.03.2010 9:19
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Проснулся сегодня и понял, что в моём коде сортировка неправильная. Так лучше:

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.




--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
lopata   поиск в строке   20.03.2010 15:58
Unconnected   Мне кажется, тут можно обойтись без Кнута-Морриса-...   20.03.2010 16:55
lopata   Мне кажется, тут можно обойтись без Кнута-Морриса...   20.03.2010 17:31
Unconnected   Можно так: const mn:set of char=[]; var s:string;...   20.03.2010 21:10
lopata   насколько я понимаю, const mn:set of char=Добавлен...   20.03.2010 21:16
Unconnected   Тогда так: var s:string; i,j,m,ind,mnind,coun...   20.03.2010 21:25
lopata   А можешь, пожалуйста, пояснить как ты это делал. Н...   20.03.2010 21:33
lopata   Неправильно работает   20.03.2010 21:54
Client   пример приведи   20.03.2010 21:55
lopata   Спасибо, конечно, мне не нужно мне было свой код п...   20.03.2010 21:55
Unconnected   Ну, у меня при строке abccccc и m=3 выдаёт ответ...   20.03.2010 22:03
lopata   Ну, у меня при строке abccccc и m=3 выдаёт ответ ...   20.03.2010 22:05
lopata   Прости, пожалуйста :give_rose: У тебя все верно)...   20.03.2010 22:23
Unconnected   Должно 9. Неправда. Выдаёт 8, как и должно б...   20.03.2010 22:22
Unconnected   'a' - 4 символа 'c' - 2 символа ...   20.03.2010 22:46
lopata   'a' - 4 символа 'c' - 2 символа ...   20.03.2010 23:43
Unconnected   А что будет, если видов символов в строке S буде...   20.03.2010 23:54
lopata   А что будет, если видов символов в строке S будет...   21.03.2010 0:01
Unconnected   Бежим по строке, считаем, сколько раз каждый симво...   21.03.2010 0:05
lopata   Бежим по строке, считаем, сколько раз каждый симв...   21.03.2010 0:24
volvo   Что-то меня терзают сомнения, что это правильно, н...   21.03.2010 2:32
Unconnected   Проснулся сегодня и понял, что в моём коде сортиро...   21.03.2010 9:19
lopata   спасибо,volvo, но оно действительно неправильно вы...   21.03.2010 13:35
Unconnected   var s:string; i,j,m,ind,mnind,count:byte; ...   21.03.2010 14:56
lopata   Unconnected, cпасибо большое. буду разбираться..   21.03.2010 20:33
lopata   Честно говоря, все равно что-то неверно Потому как...   23.03.2010 23:42
Unconnected   Ответ должен быть 9, aaaaccccc .   24.03.2010 9:34
lopata   я поняла почему 9. прото мне казалось, что символы...   24.03.2010 12:19
volvo   Правильно казалось. Символы должны стоять именно п...   24.03.2010 12:26
lopata   Правильно казалось. Символы должны стоять именно ...   24.03.2010 18:22
lopata   Тольконе совсем поняла что ты делал с Max.   24.03.2010 19:14
volvo   Искал наибольшее, что и требовалось... На каждой и...   24.03.2010 19:23
lopata   Всё, поняла. спасибо большое.   24.03.2010 19:41


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 10:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"