假设你有一个单词
"向日葵"
您只能在其上执行一种操作类型,选择一个角色并将其移到前面。 例如,如果你选择了' f',那么这个词将是" fsunlower"。
您可以进行一系列操作。
问题是在给定派生词和原始词的情况下获得所需的最小操作数。因此,如果输入字符串是" fwsunloer"," sunflower",则输出为3.
答案 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包含相同字符集的假设。否则,您需要在使用函数
之前检查它