Заменить в самом длинном слове строки буквы 'a' на 'b'

Задача

Дана строка символов. Группы символов, разделенные одним или несколькими пробелами и не содержащие пробелов внутри себя, будем называть словами. В самом длинном слове заменить все буквы «a» на «b».

Решение

 

Описание переменных: 

  • len - длина строки
  • id - индекс первого символа самого длинного слова в строке
  • max - длина самого длинного слова в строке
  • count - длина текущего слова

Алгоритм решения задачи: 

  1. Если очередной символ не пробел, то увеличиваем длину текущего слова.
  2. Иначе если длина текущего слова больше, чем max, то перезаписываем max и устанавливаем id в начало этого слова. Для этого из индекса текущего символа вычитаем длину слова, получаем индекс первой буквы слова.
  3. В ветке else также обнуляем count (слово закончилось, будем измерять следующее).

Проблема данного алгоритма в том, что длина последнего слова, если после него нет пробела, не сравнивается с max. Поэтому за пределами цикла пишем отдельную инструкцию if. Чтобы этого избежать, можно поменять местами тела if и else в цикле (а также условие при if на равенство с пробелом). Но тут возникают другие проблемы, связанные с концом строки.

Программа на языке Паскаль: 

 

var	
	s: string;
	i, id, len, max, count: byte;
 
begin
	readln(s);
	len := length(s);
	max := 0;
	id := 0;
	count := 0;
	for i:=1 to len do 
		if s[i] <> ' ' then
			count := count + 1
		else begin
			if count > max then begin
				max := count;
				id := i - count;
			end;
			count := 0
		end;
 
	if count > max then begin // for last word
		max := count;
		id := i - count;
	end;			
 
	for i:=id to id+max do
		if s[i] = 'a' then 
			s[i] := 'b';
 
	writeln(s);
end.

 

Пример выполнения программы:

That abstract data too parameters
That abstract data too pbrbmeters

 

Тема

Строки

Уровень

Комбинированные задачи

Комментарии

program zamena_a_na_b;
uses crt;
var  s,word: string; i,m,k,n:integer;
begin
    clrscr;
    writeln('Vvedite stroku: ');
    readln(s);
 
    for i:=1 to length(s) do
     delete(s,pos('  ',s),1);
 
    if s[1]=' ' then delete(s,1,1);
    if s[length(s)]<> ' ' then s:=s+' ';
 
    for i:=1 to length(s) do
    if (s[i]='!') or  (s[i]='.') or  (s[i]=',') or  (s[i]='(') or (s[i]=')') or (s[i]='?')   then
    delete(s,i,1);  
// все предыдущие строки - стандартны: удаляем лишние символы и добавляем в конце пробел, чтоб посчитать последнее слово
 
    for i:=1 to length(s) do
    begin
        if s[i]<>' ' then n:=n+1
        else break;
    end;
    word:=copy(s,1,n);  //определяем первое слово, чтоб начать сравнивать
 
    k:=0;
    for i:=1 to length(s) do
    begin
        if s[i]<>' ' then
        begin
            k:=k+1;  //определяем длину слова
        end
        else
        begin
            if k>n then
            begin
                word:=copy(s,i-k,k);
                n:=k;       
            end;    //сравниваем длины слов. если след. дольше, то оно - искомое 
            k:=0;   //иначе первое(или предыдущее) слово - искомое.
        end;
    end;
    for i:=1 to length(word) do
    if word[i]='a' then word[i]:='b';
    writeln(word);  //тут просто меняем символы и выводим результат
    readln;
end.

Var
  i,Len,Id,Max,Count: Integer;
  Str: String;
Begin
  WriteLn('Введите строку:');
  ReadLn(Str);
  If(Str[Length(Str)]<>' ') Then
    Str:=Str+' ';
  Len:=Length(Str);
  Count:=0;
  Max:=0;
  Id:=0;
  For i:=1 To Len Do
    Begin
      If(Str[i]<>' ') Then
        Count:=Count+1
          Else
           Begin
            If(Count>Max) Then
              Begin
              Max:=Count;
              Id:=i-Count;
              Count:=0;
              End
           Else
            Count:=0;
           End;
    End;
  For i:=Id To Id+Max Do
    Begin
      If(Str[i]='а') Then
        Str[i]:='б';
    End;
  WriteLn(Str);
End.