Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Задача 3.1
- % Написать скрипт, в котором:
- % генерируется строковая переменная длиной 5000 символов,
- % каждый ее символ - случайно выбранный из букв ‘A’, ‘B’ и ‘C’;
- % в строке выделяется самый длинный палиндром
- % (последовательность символов, которая читается
- % одинаково в прямом и обратном направлениях);
- % пользователю выводится сообщение (диалоговое окно),
- % в котором указана длина (число символов)
- % самого длинного палиндрома;
- % Для сравнения строковых переменных рекомендуется
- % использовать функцию strcmp().
- global sizeM STR p
- sizeM = 5000
- data_=['A' 'B' 'C'];
- MixNumb = randi(3,1,sizeM);
- SCAN= data_(MixNumb);
- SCANT=flip(SCAN,2);
- STR=num2str(strcmp(SCAN,SCAN));
- STR(strfind(STR, ' ')) = [];
- tic; % tic - начало измерения времени
- ArrCollection=[]
- s=20;
- ARS=0;
- for size=s:-1:1
- for k=1:1:sizeM-size
- ar=strfind(SCAN, SCANT(k:k+size));
- if(length(ar))
- if (SCAN(k:k+size) == flip(SCAN(k:k+size)))
- ArrCollection = cat(2,ArrCollection,ar);
- ARS=size;
- ARS_i=k;
- break;
- end
- end
- end
- if(ARS)
- break;
- end
- end
- t1 =toc % toc - завершение измерения времени
- ar
- ARS+1
- BB=SCAN(ARS_i:ARS_i+ARS)
- s=ones(sizeM,sizeM);
- a = ones(sizeM/2,sizeM/2);
- b=triu(a,1);
- bb=triu(a,2);
- c=cat(2,b,flip(bb,2)) %матрица пирамида
- tic; % tic - начало измерения времени
- for jj=1:1:sizeM/2-1
- start_=1+jj; end_= sizeM-jj-1; % оптимизация кода
- for ii = start_:1:end_
- if (c(jj,ii))
- sL = ii-jj;
- sR = ii+jj+1;
- if (SCAN(1,sL:ii) == flip(SCAN(1,ii+1:sR))) % проверка на палиндром
- % global MAX_ SIZE
- MAX_=ii;
- SIZE=sR-sL+1;
- end
- end
- end
- end
- t2 =toc % toc - завершение измерения времени
- %Проверка
- out = SCAN(1,(MAX_-(SIZE-1)/2):(MAX_+(SIZE-1)/2))
- length(out)
- s=ones(sizeM,sizeM);
- a = ones(sizeM/2,sizeM/2);
- b=triu(a,1)
- c=cat(2,b,flip(b,2)); %матрица пирамида
- tic; % tic - начало измерения времени
- for jj=1:1:sizeM/2-1
- start_=1+jj; end_= sizeM-jj; % оптимизация кода
- for ii = start_:1:end_
- % if (c(jj,ii))
- sL = ii-jj;
- sR = ii+jj;
- if (SCAN(1,sL:ii) == flip(SCAN(1,ii:sR))) % проверка на палиндром
- MAX_=ii;
- SIZE=sR-sL+1;
- end
- % end
- end
- end
- t3 =toc % toc - завершение измерения времени
- %Проверка
- out = SCAN(1,(MAX_-(SIZE-1)/2):(MAX_+(SIZE-1)/2))
- length(out)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement