题目链接
题意:给出字符串s和t,每次你可以把s中的任意字符拿到首或尾,问你要把s变成t,最小的移动次数。
思路:我们发现只要s存在一个子序列和t中某一段连续字串相同,假设子序列长度为x,那么移动次数一定为n-x,那么题目就是变成了求s和t中最长的子序列,由于n很小,暴力即可。关键就是要考虑那些不动。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+1;
char s[maxn],t[maxn],num[1001];
int main()
{
int n,q,ans;
scanf("%d",&q);
while(q--)
{
ans=0x3f3f3f3f;
scanf("%d",&n);
scanf("%s %s",s,t);
for(int i=0;i<n;++i)
{
num[s[i]]++;int k=i;
for(int j=0;j<n;++j)
if(k<n&&s[j]==t[k]) k++;
ans=min(ans,n-k+i);
}
sort(s,s+n);
sort(t,t+n);
if(strcmp(s,t)!=0) {
printf("-1\n");continue;
}
printf("%d\n",ans);
}
}