Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Вниз

полиндромы   Найти похожие ветки 

 
~Aid~   (2006-10-25 00:35) [0]

дана строка
надо определить сколько в  ней полиндромов(слова разделены одним или несколькоми пробелами)
как сделать по-быстрому?


 
~Aid~   (2006-10-25 00:46) [1]

короче протестите прогу

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

function polindromGOOD(s1:string;a,b:integer):boolean;
var k,l:integer;
begin
l:=b;
result:=true;
  for k:=a to b do
   begin
     if s1[k]<>s1[l] then begin result:=false;exit;end;
     dec(l);
   end;
end;
var
   s:string;
   i,j,count,n1,n2: integer;
   flag:boolean;
begin
 count:=0;
 readln(s);
 s:=" "+s+" ";
 for i:=1 to length(s) do
  begin
    if s[i]=" " then
     begin
        n1:=i+1;
        for j:=i+1 to length(s) do
         begin
           if s[j]=" "
            then
               begin
                 n2:=j-1;
                 if j-i=1 then break;
                 flag:=polindromGOOD(s,n1,n2);
                  if  flag = true then inc(count)
                   else break;

               end;
         end;
     end;
  end;
 writeln(count);
 readln;
end.


 
Наиль ©   (2006-10-25 00:49) [2]

1. Во вторую строку добавляешь по букве из первой строки до ближайшего пробела.
2. В третью строку помещаешь перевернутую вторую.
3. Сравниваешь вторую и третью строку, если равны увеличиваешь счётчик.
4. Делаешь вторую строку пустой.
5. Если не конец строки, то п.1


 
DrPass ©   (2006-10-25 00:50) [3]

Замечание первое: пАлиндром пишется через "А" :)


 
~Aid~   (2006-10-25 00:53) [4]

точно DrPass опечатался...


 
~Aid~   (2006-10-25 00:54) [5]

Наиль © у меня проще...

вы просто проверьте правильно ли я сделал


 
Орион ©   (2006-10-25 00:58) [6]

> [5] ~Aid~   (25.10.06 00:54)

а запустить самому не судьба?


 
~Aid~   (2006-10-25 01:00) [7]

нет сейчас под рукой дельфы
я в блокноте написал
попутный вопрос:
как определить сколько строк находится в данный моментв TMemo


 
Орион ©   (2006-10-25 01:01) [8]

> [7] ~Aid~   (25.10.06 01:00)

Memo1.Lines.Count


 
Наиль ©   (2006-10-25 01:02) [9]


> вы просто проверьте правильно ли я сделал

Работает

> как определить сколько строк находится в данный моментв
> TMemo

Memo1.Lines.Count


 
~Aid~   (2006-10-25 01:03) [10]

спасибо


 
Наиль ©   (2006-10-25 01:04) [11]


> if  flag = true then inc(count)

if flag then inc(count) - так правельнее


 
Орион ©   (2006-10-25 01:08) [12]

а по программе: я бы рекурсию не делал, какой в ней смысл?

Что-то типа:
function Check(AText: string): Boolean;
var
 i, Len: integer;
begin
 Result:=True;
 Len:=Length(AText);
 for i:=1 to (Len div 2) do
 if AText[i]<>AText[Len-i+1] then
 begin
   Result:=False;
   Break;
 end;
end;


Основной алгоритм:
- выделил подстроку из строки (функции Fetch, TrimLeft)
- прогнал через Check, если True, то Inc(Count)


 
Орион ©   (2006-10-25 01:11) [13]

хы-хы) сегодня явно не мой день: рекурсии у тебя нет - у меня глюки.
Но код перепиши.


 
Орион ©   (2006-10-25 01:21) [14]

Честно выдрано из Indy =)
function Fetch(var AInput: string; const ADelim: string; const ADelete: Boolean): string;
var
 LPos: Integer;
begin
 if ADelim = #0 then begin
   // AnsiPos does not work with #0
   LPos := Pos(ADelim, AInput);
 end else begin
   //? may be AnsiUpperCase?
   LPos := Pos(UpperCase(ADelim), UpperCase(AInput));
 end;
 if LPos = 0 then begin
   Result := AInput;
   if ADelete then begin
     AInput := "";    {Do not Localize}
   end;
 end else begin
   Result := Copy(AInput, 1, LPos - 1);
   if ADelete then begin
     //faster than Delete(AInput, 1, LPos + Length(ADelim) - 1); because the
     //remaining part is larger than the deleted
     AInput := Copy(AInput, LPos + Length(ADelim), MaxInt);
   end;
 end;
end;


Ну и короче говоря:

var
 Text, Buf: string;
 i, Count: Integer;
begin
 for i:=0 to Memo1.Lines.Count-1 do
 begin
   Text:=Memo1.Lines[i];
   Count:=0;
   while Text<>"" do
   begin
     Buf:=Fetch(Text, " ");
     Text:=TrimLeft(Text);
     if Check(Buf) then Inc(Count);
   end;
   MessageDlg("В строке "IntToStr(i)+" "+IntToStr(Count)+" палиндромов", mtCustom, [mbOK], 0);
 end;
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
8-1142536058
softmaster
2006-03-16 22:07
2006.11.12
Работа с модемом


15-1161790654
Kerk
2006-10-25 19:37
2006.11.12
Пиво. Ice.


15-1161977193
Master_
2006-10-27 23:26
2006.11.12
Принцип поиска вирусов Антивирусниками


4-1151461842
piople
2006-06-28 06:30
2006.11.12
Потоки и исключения


3-1158042018
VPR
2006-09-12 10:20
2006.11.12
DBF или массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский