一道算法题怎么实现?

题目链接: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