これは、オンライン コーディング チャレンジ (完了済み) の 1 つからの質問です。
どのようにアプローチするかについて、これにはいくつかのロジックが必要です。
問題文:
同じスーパー セットの文字を持つ 2 つの文字列 A と B があります。これらの文字列を変更して、2 つの等しい文字列を取得する必要があります。各移動では、次の操作のいずれかを実行できます。
1. swap two consecutive characters of a string
2. swap the first and the last characters of a string
移動はどちらの弦でも実行できます。2 つの等しい文字列を取得するために必要な移動 の最小
数は
何ですか?
入力形式と制約: 入力
の 1 行目と 2 行目には、2 つの文字列 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 に変換します。2 つの文字列が等しくなりました。
編集:これが私の最初の試みですが、間違った出力が得られます。誰かが私のアプローチで間違っていることを教えてくれますか?
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;
}