题目详细:
给定两个字符串,仅由小写字母组成,它们包含了相同字符。 求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。 例如给定两个字符串“abcd" "bcad" ,输出:2,因为需要操作2次才能把"abcd"变成“bcad" ,方法是:abcd->cabd->bcad。
分析:
这是我做的第一题高校俱乐部编程挑战题目,一开始是很不习惯啦。看着这个通过率,还是小小担心。所以想了很久。
好了,入正题,其实就是用第二个字符串(记作b),从后到前比较第一个字符串a,直到a的头,如果b当前指向的字符与a当前指向的字符相等,则两个都下标移动,不然a减减,操作数加一(该字符需要移动(但是遍历完到时候移动即可保持所需要的序) )。即有点像找出最长的序列的感觉。
代码:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class Test {
public:
static int getNumber (string a,string b)
{
int count=0;
int a_c=a.length()-1;
int b_c=b.length()-1;
while(a_c>=0){
if(a[a_c]==b[b_c]){
b_c--;
}else{
count++;
}
a_c--;
}
return count;
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
cout<<Test::getNumber("Test","Test")<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。