给定两个字符串S和T,每次小Ho可以对S进行以下操作:
选定S中的一个字符Si,将Si移动到字符串首位。
例如对于S="ABCD",小Ho可以选择移动B从而得到新的S="BACD";也可以选择移动C得到"CABD";也可以选择移动D得到"DABC"。
请你计算最少需要几次移动操作,可以使S变成T。
Input
第一行包含一个字符串S。
第二行包含一个字符串T。
对于30%的数据,1 ≤ |S| = |T| ≤ 10
对于100%的数据,1 ≤ |S| = |T| ≤ 100000 S和T都只包含大写字母
Output
一个整数代表答案。如果无法达成,输出-1。
Sample Input
ABCD
DBAC
Sample Output
2
#include<bits/stdc++.h>
using namespace std;
char s[100010];
char t[100010];
int a[26];
int main(){
scanf("%s",s+1);
scanf("%s",t+1);
int len=strlen(s+1);
int l=len;
for(int i=1;i<=len;i++) a[s[i]-'A']++;
for(int i=1;i<=len;i++) a[t[i]-'A']--;
for(int i=0;i<26;i++) if(a[i]){
cout<<-1<<endl;
return 0;
}
int i,e=l,ee=l;
for(i=l;i>0;i--){
while(e&&t[i]!=s[e]){
e--;
}
if(e) e--,ee--;
}
cout<<ee<<endl;
return 0;
}
一开始觉得以s的第一个字母为标准,想到后面反序,所以这个标准并不是很对。任何一个字符串只要字母分别的数量一致,那么最多字符串的长度次数,以‘t为标准,反过来,找最大顺序的。