题目链接:http://oj.saikr.com/contest/20/problem/F
简单来说就是给两个字符串A和B,最少经过几次操作后,可以使A字符串变成B字符串。每个操作指的是:在A串中移动一个字母,且只能将字母移动到字符串头。 比如A串是DACB,B串是ABCD,那么操作步骤是DACB-CDAB-BCDA-ABCD,最少需要移动3次。
还有个样例是:A串是SIAJOIWUGB,B串是
IBUSJGWAOI,最少需要移动7次。
用个标记为, 然后做字符串分割,
@Test
void test0() {
// String s0 = "SIAJOIWUGB";
// String s1 = "IBUSJGWAOI";
String s0 = "DACB";
String s1 = "ABCD";
System.out.println("从[" + s0 + "]到[]" + s1 + "]需要移动" + algorithm(s0, s1) + "次");
}
private int algorithm(String s0, String s1) {
// 追踪需要的移动计数
int count = 0;
// 字符串长度
int length = s1.length();
// 角标标志
int mark = length - 1;
// 按照目标字符串长度进行遍历
for (int i = 0; i < length; i++) {
// 从目标字符串开始倒序查找
char charAt = s1.charAt(length - 1 - i);
int index = s0.lastIndexOf(charAt);
// 当 查到的索引在记号之前的时候, 说明索引后面的每个字母都需要移动
if (index < mark) {
// 计算索引后面有几个字母
count += mark - index;
// 更新 记号
mark = index - 1;
}
// 当记号为0 的时候 表面全部检查完毕,其余字母通过移动即可归为
if (index == 0) {
break;
}
}
return count;
}
A串是SIAJOIWUGB,B串是IBUSJGWAOI
思路:以B为参考,B串最左侧的三个字母一定时最后三次要移动的,最多要移动3次
第一个3次,去掉IBU后:A串:SAJOIWG,B串:SJGWAOI
第二个3次,去掉SJG后:A串:AOIW,B串:WAOI
第三个3次,去掉WAO后,A串:I,B串:I,无需移动,但是此时要判断去掉的WAO是否真的要移动3次?
同时去掉 I 后:A串AOW,B串WAO
同时去掉WA后,A串O,B串O,无需移动,也就是说,最多移动2次,再次判断去掉的WA是否需要移动2次
同时去掉O后:A串AW,B串WA,此时只需要移动W即可,也就是说只需要移动1次
也就是说上面的第三个3次其实只需要移动1次,而且整个移动的第一个字母一定时W
综上移动次数:3+3+1=7
移动顺序:
第1次移动W:WSIAJOIUGB
第2次移动G:GWSIAJOIUB
第3次移动J:JGWSIAOIUB
第4次移动S:SJGWIAOIUB
第5次移动U:USJGWIAOIB
第6次移动B:BUSJGWIAOI
第7次移动I:IBUSJGWAOI