确定获取单词的char运动次数

时间:2014-09-19 06:27:29

标签: string algorithm

假设你有一个单词

"向日葵"

您只能在其上执行一种操作类型,选择一个角色并将其移到前面。 例如,如果你选择了' f',那么这个词将是" fsunlower"。

您可以进行一系列操作。

  1. fsunlower(将f移到前面)
  2. wfsunloer(移到前面)
  3. fwsunloer(再次将f移到前面)
  4. 问题是在给定派生词和原始词的情况下获得所需的最小操作数。因此,如果输入字符串是" fwsunloer"," sunflower",则输出为3.

1 个答案:

答案 0 :(得分:2)

此问题等同于:给定字符串A和B,找到字符串A的最长后缀,它是字符串B的sub-sequence。因为,如果我们知道哪些n字符需要移动,我们只需要n个步骤。所以我们需要找到的是不需要移动的最大字符数,这相当于A中最长的后缀。

因此,对于给定的示例,最长的后缀为sunlor

Java代码:

public static void main(String[] args) {
    System.out.println(minOp("ewfsunlor", "sunflower"));
}

public static int minOp(String A, String B) {
    int n = A.length() - 1;//Start from the end of String A;
    int pos = B.length();
    int result = 0;
    while (n >= 0) {
        int nxt = -1;
        for (int i = pos - 1; i >= 0; i--) {
            if (B.charAt(i) == A.charAt(n)) {
                nxt = i;
                break;
            }
        }
        if (nxt == -1) {
            break;
        }
        result++;
        pos = nxt;
        n--;
    }
    return B.length() - result;
}

结果:

3

时间复杂度O(n)与n是字符串A的长度。

注意:此算法基于A和B包含相同字符集的假设。否则,您需要在使用函数

之前检查它