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