其实这种题要仔细想,不要畏惧它。
给两个字符串,操作是交换相邻两个字符,问a串经过多少次怎样的操作后,能成为b串。输出的第二行是每次交换的[i,i+1]的i。
#include<bits/stdc++.h>
using namespace std;
vector<int>v;
int main()
{
int n;
cin>>n;
string a,b;
cin>>a>>b;
int book[300]={0};
for(int i=0;i<n;i++)
{
book[a[i]]++;
book[b[i]]--;
}
for(int i=0;i<300;i++)
{
if(book[i]!=0){printf("-1\n");return 0;}
}
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
if(b[i]==a[j])
{//例如abcdef ; abdfec(不变的那个)
//从a里面(j>=i)找与b[i]相同的那个;
// cout<<a<<" "<<b<<endl;
for(int k=j;k>i;k--)
{//再从找到的那个位置,向i遍历;
//一次交换并记录k;和交换次数
swap(a[k],a[k-1]);
cnt++;
v.push_back(k-1+1);
//printf("%d ",k-1+1);
// printf("%d %d\n",i,j);
}
break;
}
}
// printf("\n");
}
printf("%d\n",cnt);
for(int i=0;i<v.size();i++)printf("%d ",v[i]);
}