题目链接:http://codeforces.com/problemset/problem/1015/B
-
题目大意:
-
给你两个字符串s、t,长度均为n,你每次只能将si-1与si交换位置,如果最终能将s交换成为t,则输出最小的交换次数,否则输出-1
-
思路:使用贪心的思想即可。
-
从1到n枚举t的每一位,若ti!=si,则寻找sj(j>i)于ti相同,若无法找到j则输出-1。否则让sj不断与sj-1交换位置,直到i=j
-
代码实现:
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main()
{
int n;
scanf("%d",&n);
char s[101],t[101];
int top=0;
int b[5100];
int i;
for(i=1; i<=n; i++)
cin>>s[i];
for(i=1; i<=n; i++)
cin>>t[i];
int j;
for(i=1; i<=n; i++)
{
if(t[i]!=s[i])
{
j=i+1;
while(s[j]!=t[i]&&j<=n+10)
j++;
j--;
if(j>n)
{
puts("-1");
return 0;
}
for(; j>=i; j--)
{
b[++top]=j;
swap(s[j],s[j+1]);
}
}
}
printf("%d\n",top);
for(i=1; i<=top; i++)
{
if(i==top)printf("%d\n",b[i]);
else printf("%d ",b[i]);
}
return 0;
}