Проблема с вашим кодом заключается в том, что в конце каждой итерации вы обновляете sArray
и tArray
без обновления s
и t
.
Затем на следующей итерации вы проверяете, равны ли s и t, что никогда не будет так, если только они не были равны с начала.
Итак, вы также должны обновить s
и t
.
Также в этой части вашего кода:
if (s !== t && t.length === s.length) {
sArray.shift("");
tArray.shift("");
counter += 1;
}
Не следует ли увеличить счетчик на 2? (Я вижу это как два шага, но это зависит от вас).
И, к сведению, использование s = s.substring(1);
для удаления первого символа должно быть намного сложнее, чем работа с массивами ...
Ниже приведен фрагмент, использующий вашу собственную логику, но обращающийся к тому, что я упомянул выше. Надеюсь, это поможет!
function shiftLeft(s, t) {
let counter = 0;
while(Math.min(s.length, t.length) > 0) {
if (s === t) {
return counter;
}
if (s !== t && s.length > t.length) {
s = s.substring(1);
counter += 1;
}
if (s !== t && t.length > s.length) {
t = t.substring(1);
counter += 1;
}
if (s !== t && t.length === s.length) {
s = s.substring(1);
t = t.substring(1);
counter += 2; //shouldn't this be 2 instead of 1?
}
}
return counter;
}
console.log(shiftLeft("test", "yes"));
Редактировать: Оказывается, ваше условие цикла было неправильным. Счетчик i
продолжает увеличиваться, в то время как Math.min(s.length, t.length)
продолжает уменьшаться и приближаться к нулю, поэтому цикл остановится слишком рано. Реальная логика, которую мы хотим, это продолжать цикл до тех пор, пока одна из строк не станет пустой.