首页 > 解决方案 > 为什么这个算法在追踪时没有意义?

问题描述

我已经跟踪这段代码很长一段时间了

我明白了。但在某些时候,它对我来说不再有意义。

nameandtyped中,位置 0 是同一个字母,因此同时增加 j 和 i ( j++and i++)。i = 1,j = 1。

在位置 1,它们不一样,所以只增加 j。我 = 1,j = 2。

在位置 2,它们不一样,所以只增加 j。i = 1,j = 3。这就是我卡住的地方。

为什么在控制台中它也会增加ii = 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

标签: javaalgorithmdebugging

解决方案


你自己说i的,没有增加。所以我们仍然会查看 的第一个索引name

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

所以在第三次迭代中,我们name在第一个索引 ( l) 和typed第二个索引 ( l) 进行比较,它们相同的,所以我们同时递增ij

或者将其可视化:

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


推荐阅读