Это вопрос одной из задач онлайн-кодирования (которая завершилась).
Мне просто нужна логика для этого, как подойти.
Проблема:
У нас есть две строки A и B с тем же супер набором символов. Нам нужно изменить эти строки, чтобы получить две равные строки. В каждом шаге мы можем выполнить одну из следующих операций:
1. swap two consecutive characters of a string
2. swap the first and the last characters of a string
Перемещение может выполняться в любой строке.
Что такое минимальное количество ходов, которое нам нужно, чтобы получить две равные строки?
Формат ввода и ограничения:
Первая и вторая строки ввода содержат две строки A и B. Гарантируется, что надмножество их символов равно.
1 <= length(A) = length(B) <= 2000
All the input characters are between 'a' and 'z'
Формат вывода:
Напечатайте минимальное количество ходов на единственную строку вывода
Sample input:
aab
baa
Sample output:
1
Объяснение:
Поменяйте первый и последний символ строки aab, чтобы преобразовать ее в baa. Теперь две строки равны.
EDIT: Вот моя первая попытка, но я получаю неправильный вывод. Может ли кто-нибудь вести меня, что не так в моем подходе.
int minStringMoves(char* a, char* b) {
int length, pos, i, j, moves=0;
char *ptr;
length = strlen(a);
for(i=0;i<length;i++) {
// Find the first occurrence of b[i] in a
ptr = strchr(a,b[i]);
pos = ptr - a;
// If its the last element, swap with the first
if(i==0 && pos == length-1) {
swap(&a[0], &a[length-1]);
moves++;
}
// Else swap from current index till pos
else {
for(j=pos;j>i;j--) {
swap(&a[j],&a[j-1]);
moves++;
}
}
// If equal, break
if(strcmp(a,b) == 0)
break;
}
return moves;
}