Слить две строки, вставив символы одной строки между символами другой строки - Pascal
Формулировка задачи:
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj < bj, а для всех i < j ai = bi.
Вам даны две строки: a и b.
Вам необходимо слить две строки, вставив символы одной строки между (возможно также перед или после) символами другой строки, сохранив при этом порядок следования символов в исходных строках. Новая строка должна быть лексикографически максимальной из всех возможных.
Входные данные
В первой строка дана строка a. Во второй строке дана строка b.
Выходные данные
Выведите одну строку — лексикографически максимальную строку, которую можно получить слиянием строк a и b.
Ограничения
Строки состоят из строчных букв латинского алфавита. Длина строк не превышает 1000.
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.
Объяснение кода листинга программы
- Создаются три переменные типа String: a, b, c.
- Создаются две переменные типа Integer: i, j.
- Определяются два процедурных блока: TakeA и TakeB. Каждый из них увеличивает значение переменной c на соответствующий символ из строк a и b.
- Определяется функция LookForA. В ней создаются две временные переменные ii и jj, инициализированные значениями i и j соответственно.
- В цикле while происходит сравнение символов a[ii], a[jj] и b[jj]. Если все три символа равны, то увеличивается значение ii и jj, и цикл продолжается до тех пор, пока все символы не будут равны.
- После цикла, в функции LookForA проверяется, больше ли последний символ a[ii] больше последнего символа b[jj]. Если это условие выполняется, то функция возвращает true, иначе - false.
- Инициализируются переменные a, b, c.
- Запускается цикл while, который выполняется до тех пор, пока в строках a или b есть символы.
- Если в строке a или b есть символ, то выполняется одна из трех операций: если a[i] больше b[j], то выполняется процедура TakeA, иначе если a[i] меньше b[j], то выполняется процедура TakeB, иначе выполняется функция LookForA.
- После выполнения всех операций, в переменной c хранится объединенная строка.
- Выводится значение переменной c.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д