Введение
Чтобы определить проблему в вашем коде, давайте упростим ее.
Упростим 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
в t
с шагом s.length() + t.length() - 2*commonLength
. Однако это значение 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";
}