Слить две строки, вставив символы одной строки между символами другой строки - Pascal

Узнай цену своей работы

Формулировка задачи:

Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj < bj, а для всех i < j ai = bi. Вам даны две строки: a и b. Вам необходимо слить две строки, вставив символы одной строки между (возможно также перед или после) символами другой строки, сохранив при этом порядок следования символов в исходных строках. Новая строка должна быть лексикографически максимальной из всех возможных.
Ограничения
Строки состоят из строчных букв латинского алфавита. Длина строк не превышает 1000.
Входные данные В первой строка дана строка a. Во второй строке дана строка b. Выходные данные Выведите одну строку — лексикографически максимальную строку, которую можно получить слиянием строк a и b.
input.txt output.txt
ca
dbxb
dcbxba
input.txt output.txt
abc
xyz
xyzabc
input.txt output.txt
aa
aa
aaaa

Решение задачи: «Слить две строки, вставив символы одной строки между символами другой строки»

textual
Листинг программы
var
  a, b, c: String;
  i, j: Integer;
procedure TakeA; begin c:=c+a[i]; Inc(i); end;
procedure TakeB; begin c:=c+b[j]; Inc(j); end;
function LookForA: Boolean;
var ii, jj: Integer;
begin
  ii:=i; jj:=j;
  while (a[ii]<>#0) and (a[jj]<>#0) and (a[ii]=b[jj]) do begin
    Inc(ii); Inc(jj);
  end;
  LookForA:=a[ii]>b[jj];
end;
begin
  ReadLn(a); ReadLn(b);
  a:=a+#0; b:=b+#0; c:=''; i:=1; j:=1;
  while (a[i]<>#0) or (b[j]<>#0) do
    if      a[i]>b[j] then TakeA
    else if a[i]<b[j] then TakeB
    else if LookForA  then TakeA else TakeB;
  WriteLn(c);
end.

Объяснение кода листинга программы

  1. Создаются три переменные типа String: a, b, c.
  2. Создаются две переменные типа Integer: i, j.
  3. Определяются два процедурных блока: TakeA и TakeB. Каждый из них увеличивает значение переменной c на соответствующий символ из строк a и b.
  4. Определяется функция LookForA. В ней создаются две временные переменные ii и jj, инициализированные значениями i и j соответственно.
  5. В цикле while происходит сравнение символов a[ii], a[jj] и b[jj]. Если все три символа равны, то увеличивается значение ii и jj, и цикл продолжается до тех пор, пока все символы не будут равны.
  6. После цикла, в функции LookForA проверяется, больше ли последний символ a[ii] больше последнего символа b[jj]. Если это условие выполняется, то функция возвращает true, иначе - false.
  7. Инициализируются переменные a, b, c.
  8. Запускается цикл while, который выполняется до тех пор, пока в строках a или b есть символы.
  9. Если в строке a или b есть символ, то выполняется одна из трех операций: если a[i] больше b[j], то выполняется процедура TakeA, иначе если a[i] меньше b[j], то выполняется процедура TakeB, иначе выполняется функция LookForA.
  10. После выполнения всех операций, в переменной c хранится объединенная строка.
  11. Выводится значение переменной c.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы