Хорошо, это то, что программа делает с двумя циклами for.
Представьте «cnt1» как английский алфавит от «A» до «Z», написанный на бумаге слева направо, как и «cnt2». Во-первых, цикл for помечает букву на бумаге, если она найдена в «string1», и второй - «string2».
Теперь у вас есть две бумаги с буквами от «А» до «Z», написанные слева направо, и после выполнения двух «для циклов» каждая бумага имеет метки на тех буквах, которые присутствовали в соответствующие строковые входы.
Теперь, если буква отмечена галочкой на обеих бумагах, оставьте ее в покое, и если вы обнаружите какую-либо букву, отмеченную галочкой на одном листе (то есть в массиве), и не отмечен галочкой в другом массиве, то посчитайте ее как письмо, которое будет удалено.
К тому времени, когда вы отсканируете обе бумаги, подобные этой, слева направо, у вас будет количество букв, которые необходимо полностью удалить из обеих бумаг.
Посмотрим, как это реализовано в коде. Начальные значения по умолчанию для массива примитивов - все нули, и действие «пометить галочкой» букву на бумаге достигается путем изменения этого конкретного индекса на «1».
Таким образом, к моменту окончания первых двух циклов for каждый из массивов 'cnt1' и 'cnt2' будет содержать '1' в случайном порядке. Если оба массива имеют «1» или «0» для данного индекса, вам не нужно их считать, если они будут разными, т.е. разница этого конкретного индекса для обоих массивов равна «1» (вот почему вы видите Math. abs используется), то это буква, которая будет удалена из первой строки или второй.
edit: Для конкурсных экзаменов вы должны сначала иметь возможность визуализировать решение, а затем найти оптимальное. Компьютеры только добавляют скорость к найденному решению. Они не думают, мы заставляем их думать :)
Надеюсь, вы могли бы сначала визуализировать решение и все еще привыкать к программированию. Всего наилучшего!