String 确定获取单词的字符移动次数

String 确定获取单词的字符移动次数,string,algorithm,String,Algorithm,假设有人给你一句话 “向日葵” 只能对其执行一种操作类型,拾取一个字符并将其移动到前面。 例如,如果你选择了“f”,那么这个词就是“fsunlower” 您可以进行一系列这样的操作 fsunlower(将f移到前部) wfsunloer(移动到前面) fwsunloer(再次将f移到前面) 问题是在给定派生字和原始字的情况下,获得所需的最小操作数。因此,如果输入字符串为“fwsunloer”、“sunflower”,则输出为3 这个问题相当于:给定字符串A和B,找到字符串A的最长后缀,即字符串B

假设有人给你一句话

“向日葵”

只能对其执行一种操作类型,拾取一个字符并将其移动到前面。 例如,如果你选择了“f”,那么这个词就是“fsunlower”

您可以进行一系列这样的操作

  • fsunlower(将f移到前部)
  • wfsunloer(移动到前面)
  • fwsunloer(再次将f移到前面)

  • 问题是在给定派生字和原始字的情况下,获得所需的最小操作数。因此,如果输入字符串为“fwsunloer”、“sunflower”,则输出为3

    这个问题相当于:给定字符串A和B,找到字符串A的最长后缀,即字符串B的A。因为,如果我们知道需要移动哪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包含相同字符集的假设。否则,在使用函数之前需要检查该值

    如果输出为3,则通过“蛮力”只需测试9*9*9组合。即使没有答案,也需要检查“仅”9^9个组合。