Заменить подстроку между соответствующими скобками

Задача

Написать функцию, заменяющую подстроку, которая начинается с первого вхождения в строку s открывающей квадратной скобки и заканчивается соответствующей ей закрывающей квадратной скобкой, на строку s1, и возвращающую подстроку, заключенную между скобками в качестве своего значения.

Решение

 

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

Глобальные переменные:

  • s - исходная строка;
  • s_in - строка, на которую надо заменить найденную подстроку;
  • s_out - найденная подстрока в квадратных скобках.

Параметры функции:

  • fs - исходная строка, передается как параметр-переменная (т. е. при изменении ее значения внутри функции, будет изменено значение глобальной переменной);
  • fs_in - строка, которую надо вставить в исходную строку.

Переменные в функции:

  • p1 - позиция в строке открывающей скобки;
  • p2 - позиция в строке соответствующей скобки для p1;
  • count - счетчик открывающих скобок.

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

  1. Ищем первую квадратную скобку.
  2. Если скобка была найдена, то прекращаем данный цикл, фиксируем позицию скобки и выполняем остальные действия.
  3. Перебираем символы дальше. Если встретится открывающая скобка, то увеличиваем счетчик открывающих скобок.
  4. Если встретится закрывающая скобка, то проверяем, не равен ли нулю счетчик открывающих скобок. Если равен, то фиксируем позицию закрывающей скобки. Если не равен, то уменьшаем счетчик на 1.
  5. Если закрывающая скобка была найдена, то вырезаем из строки подстроку от открывающей до закрывающей скобок (и скобки тоже) и вставляем в это место новую подстроку.

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

 

var
    s, s_in, s_out: string;
 
function change_out2in(var fs: string; fs_in: string): string;
var p1, p2, i, count: byte;
begin
	p1 := 0;
	for i:=1 to length(fs) do 
		if fs[i] = '[' then begin
			p1 := i;
			break;
		end;
	p2 := 0;
	if p1 <> 0 then begin
		count := 0;		
		for i:=p1+1 to length(fs) do
			if fs[i] = '[' then count := count + 1
			else
				if fs[i] = ']' then 
					if count = 0 then begin
						p2 := i;
						break;
					end
					else count := count - 1;		
	end;
	if p2 <> 0 then begin
		change_out2in := copy(fs,p1+1,p2-p1-1);
		delete(fs,p1,p2-p1+1);
		insert(fs_in,fs,p1);
	end
	else 
		change_out2in := 'BAD STRING. NOT CHANGE!';
 
end;
 
begin
	write('s: '); readln(s);
	write('s_in: '); readln(s_in);
 
	s_out := change_out2in(s, s_in);
 
    writeln('s: ', s);
    writeln('s_out: ', s_out);
end.

 

Результаты тестирования программы:

s: [what] big tee and [coffee]
s_in: hello
s: hello big tee and [coffee]
s_out: what
s: hello [who]...
s_in: iam
s: hello iam...
s_out: who
s: hello [bom [ye (ll]) ] trolls!
s_in: world
s: hello world trolls!
s_out: bom [ye (ll]) 
s: dk[kd[dkfj]
s_in: s
s: dk[kd[dkfj]
s_out: BAD STRING. NOT CHANGE!

 

Тема

Процедуры, функции, рекурсии

Уровень

Сложные задачи

Комментарии

Логика не совсем верная.

К примеру:

s: hello [bom [ye (ll]) ] trolls!
s_in: world
s: hello world trolls!     =>   а должно быть:            hello [bom world trolls!
s_out: bom [ye (ll]) 

так как отсчёт должен идти симметрично с конца.

Добавить комментарий