简介
要发现代码中的问题,让我们对其进行简化。
简化limite计算
要计算limite 值,您可以使用if/else 块,如下所示:
if (s.length() < t.length()){
limite += s.length();
} else if (s.length() >= t.length()){
limite += t.length();
}
但是,由于您的 limite 在此块之前始终是 0 并且您正在寻找的是最短字符串的长度,您可以简单地将其替换为:
int limite = Math.min(s.length(), t.length());
简化diferen计算
同样,您不需要任何if 块来计算您的diferen - 如果两个字符串的长度相同,那么diferen 就是0,这就是Math.abs(t.length() - s.length()) 也会产生的结果。
所以,不要这样:
int diferen = 0;
if (s.length() != t.length()) {
diferen += (Math.abs(t.length() - s.length()));
}
您可以简单地使用单线:
int diferen = (Math.abs(t.length() - s.length()));
更好的变量名
diferen 或 cont 或 limite 这样的变量名称令人困惑。相反,您可以将这些变量重命名为 absLengthDifference、operationCount 和 commonLength。
您的简化代码
static String appendAndDelete(String s, String t, int k) {
int operationCount = 0;
int shorterStringLength = Math.min(s.length(), t.length());
for (int i = 0; i < commonLength; i++) {
if (s.charAt(i) != t.charAt(i)) {
operationCount += 2;
}
}
int absLengthDifference = (Math.abs(t.length() - s.length()));
operationCount += absLengthDifference;
if(operationCount <= k) {
return "Yes";
}
return "No";
}
发现逻辑错误
因此,根据简介中所做的修改,我们将找出程序产生错误结果的原因。
让我们考虑如下输入:
ab
bb
2
您的程序将对此作出肯定的判断,因为 operationCount 将是 2 但 operationCount <= 2。所以,这是不正确的,因为要在任务中使用操作将ab 转换为bb,我们必须执行以下操作:
'ab' -> 'a' |到达“a”的唯一方法是删除“b”
'a' -> '' |纠正“a”的唯一方法是先将其删除
'' -> 'b' |然后附加'b'
'b' -> 'bb' |最后,再次追加'b'
如您所见,我们需要4 操作才能达到预期的结果,而不是2。因此,下面的块是错误的:
for (int i = 0; i < commonLength; i++) {
if (s.charAt(i) != t.charAt(i)) {
operationCount += 2;
}
}
添加是不够的2。如果您发现不匹配,则必须从末尾删除所有字符才能找到它(如示例中所示)。
另外,if(operationCount <= k) 是错误的,因为操作数必须正好是k。
解决办法
- 首先要意识到的是,如果
k 大于或等于字符串长度的总和,那么答案是Yes。我们可以从原始字符串s 中删除所有字符,并继续从空字符串0 中删除一个字符或更多次,然后从目标字符串t 中追加字符。
- 否则,如果找到两个公共字符串的长度
commonLength,那么我们可以在s.length() + t.length() - 2*commonLength步骤中将s转换为t。但是,由于显而易见的原因,该值 minOperationCount 不能大于 k。此外,如果小于k,则k - minOperationCount 必须是2 的倍数。如果不是,则可以完全按照k 步骤进行转换。
代码
// Complete the appendAndDelete function below.
static String appendAndDelete(String s, String t, int k) {
int totalLength = s.length() + t.length();
if (totalLength <= k) {
return "Yes";
}
int commonLength = 0;
for (int i = 0; i < Math.min(s.length(), t.length()); i++) {
if (s.charAt(i) != t.charAt(i)) {
break;
}
commonLength++;
}
int minOperationCount = totalLength - 2 * commonLength;
if(minOperationCount <= k && ((k - minOperationCount) % 2 == 0)) {
return "Yes";
}
return "No";
}