【问题标题】:Leetcode longest common prefixLeetcode最长公共前缀
【发布时间】:2022-11-22 05:22:42
【问题描述】:

我搜索了其他帖子,这个解决方案从未被讨论过,所以它不是重复的。我很难遵循这个解决方案。我知道我们设置了一个前缀,并循环遍历数组的其余部分并不断切割前缀直到前缀完全存在于每个字符串中但是为什么我们在 while 循环中执行 strs[i].indexOf(output) != 0?如果有人可以引导我完成此操作,我将不胜感激。

public String longestCommonPrefix(String[] strs) {
    if(strs.length == 0) {
        return "";
    }
    String output = strs[0];
    for(int i = 1; i < strs.length; i++) {
        while(strs[i].indexOf(output) != 0) {
            output = output.substring(0, output.length() - 1);
        }
    }
    return output;
}

【问题讨论】:

  • 这就是砍掉它的原因。它从 output 的末尾一次一个地删除字符,直到 strs[i].indexOf(output) != 0falsestrs[i]output 开头),然后它必须对每个字符串执行相同的操作以确保获取实际的公共前缀。您是否阅读过此处有关各种方法的文档?这似乎会被它涵盖。

标签: java


【解决方案1】:

!= 0 表示前缀字符串没有从字符串的开头开始。如果索引 &gt; 0 则它进一步进入字符串。如果它是-1,它根本不存在于字符串中。如果是== 0,它从头开始。

请注意,while 循环使用 substring 继续备份,直到前缀匹配开头。然后它退出 while 循环。然后它继续查看下一个字符串是否包含第一个字符串并备份直到它们共享相同的前缀。这一直持续到返回最长的公共前缀或空字符串为止。

【讨论】:

    【解决方案2】:

    使用“not startWith”会更容易理解(也更有效)。

        while (!strs[i].startsWith(output)) {
            output = output.substring(0, output.length() - 1);
        }
    

    indexOf 还会在其他位置搜索等于 output 的子字符串。

    这将更具可读性,因为“只要 strs[i] 不以前缀开头,将前缀缩短 1。空前缀 (output) 将退出循环。(然后您也可以跳出为了环形。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2018-09-30
      • 2013-04-14
      • 2012-02-01
      • 2020-07-05
      • 2020-02-10
      • 2020-06-06
      相关资源
      最近更新 更多