题目:给定两个字符串S、T,保证0<|S|=|T|<100000;即长度相等,先输入S、后输入T,若S经过变换可以变为T,则输出对应的变换次数,若不行,则输出-1。变换是指把某个字母放到字符串的末尾。串由小写字母组成。
例子:
输入:
acdk
ckad
输出:
2
说明:第一步把a提到末尾,第二步把d提到末尾。
思路: 是否可以变化为另一个串用桶排序,比较两个串a~z的数目是否相同,若相同则一定可以变换得到,若可以变换得到,则比较T串和S串,把其中排列顺序相同的数统计出来,最后用总长度减去这个数,就是往末尾移动的字母的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 26;
int ss[N];
int tt[N];
int i=0;
int j=0;
int flag = 0;
int cnt = 0;
int main(void)
{
string s,t;
cin >> s;
cin >> t;
for(i=0; i<s.length(); i++){
ss[s[i]-97]++;//通过ASCII码进行统计
}
for(j=0; j<t.length(); j++){
tt[t[j]-97]++;
}
for(i=0; i<N; i++){//桶排序检测两个串是否相等
if(ss[i] != tt[i]){
flag = 1;
}
}
// cout << flag << endl;
if(flag == 1){
cout << -1 << endl;
}
if(flag == 0){
for(i=0; i<t.length(); i++){
for(j=0; j<s.length(); j++){
if(t[i] == s[j]){
i++;//重要
j++;
cnt++;
}
}
break;//S串只比较一遍,到末尾了就停下
}
// cout << s.length() << endl;
// cout << cnt << endl;
cout << s.length() - cnt << endl;
}
return 0;
}