天天看点

L - 修改字符串

给定两个字符串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为标准,反过来,找最大顺序的。