Почему этот алгоритм не имеет смысла при трассировке? - PullRequest
0 голосов
/ 06 февраля 2019

Я довольно долго отслеживаю этот код

Я понимаю.Но в какой-то момент это перестало иметь смысл для меня.

В name и typed позиция 0 - это одна и та же буква, поэтому увеличивайте j и i (j++ и i++).i = 1, j = 1.

В положении 1 они не одинаковы, поэтому ТОЛЬКО увеличивайте j.i = 1, j = 2.

В положении 2 они не одинаковы, поэтому ТОЛЬКО увеличивайте j.i = 1, j = 3. Вот где я застрял.

Как получается, что в консоли также увеличивается i (i = 2, j = 3)?Буквы разные, что означает только приращение j.Может кто-нибудь указать, что я не вижу?

Это проблема Leetcode, которую я делаю https://leetcode.com/problems/long-pressed-name/

Вот мой код:

class Solution {
    public String name = "alex";
    public String typed = "aaleex";
    public boolean isLongPressedName(String name, String typed) {
        if(name == null) return false;
        if(typed == null) return false;

        int i = 0;
        int j = 0;

        for(;i < name.length() && j < typed.length();) {
            if(name.charAt(i) == typed.charAt(j)) {
                j++;
                i++;
                System.out.println("END IF");
            } else {
                j++;
                System.out.println("END ELSE");
            }
            System.out.println("i => " + i);
            System.out.println("j => " + j);


            if(i != name.length() && j == typed.length()) {
                return false;
            }

        }
        return true;
    }
}

Вывод на консоль:

END IF
i => 1
j => 1
END ELSE
i => 1
j => 2
END IF
i => 2
j => 3
END IF
i => 3
j => 4
END ELSE
i => 3
j => 5
END IF
i => 4
j => 6

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Давайте сделаем простой пробный прогон, и вы поймете, в чем проблема.

if(name.charAt(i) == typed.charAt(j))

Когда я равен 1, то charAt (i) => 'l' Так что, когда j равен 2, то charAt (j) => 'l', поэтому оба будут увеличены.

Тогда оба будут увеличены на 1. Таким образом, я стал бы 2, а j стал бы 3.

a l e x

0 1 2 3


a a l e e x

0 1 2 3 4 5

i 0 = j 0

i 1 = j 2

i 2 = j 3

i 3 = j 5
0 голосов
/ 06 февраля 2019

Вы сказали это сами, i не был увеличен.Таким образом, мы все еще будем смотреть на первый индекс name:

 if(name.charAt(i) == typed.charAt(j))

Так что на третьей итерации мы сравниваем name с первым индексом (ltyped во втором индексе, (l) и они равны , поэтому мы увеличиваем i и j

Или для визуализации этого:

alex    //i == 0
^
aaleex  //j == 0
^

Оба одинаковы, поэтому оба увеличиваются:

alex    //i == 1
 ^
aaleex  //j == 1
 ^

Они не являются, поэтому увеличивается только второе значение:

alex    //i == 1
 ^
aaleex  //j == 2
  ^

Теперь они указываютк одной и той же букве, поэтому оба снова увеличиваются

alex    //i == 2
  ^
aaleex  //j == 3
   ^

Оба одинаковы, оба увеличиваются

alex    //i == 3
   ^
aaleex  //j == 4
    ^

Не то же самое, только j увеличивается

alex    //i == 3
   ^
aaleex  //j == 5
     ^

Оба одинаковы, но мы достигли конца String

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...