[更文刷题] 14. 最长公共前缀

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

14. 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入: strs = ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: strs = ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

二、思路分析:

  1. 首先,你一定要仔细读题,如果面试的话,需要和面试官确认自己对题目的理解是否正确。

  2. 然后,你可以看到,是公共前缀,既然是前缀,那么一定是从0开始,否则就不用前缀了。

  3. 边界条件需要考虑一下。

  4. 然后可以找出数组中,长度最小的一个,作为你要循环匹配的边界,比如数组长度为3,而数组中长度最小为5,

    那么5肯定是最外面的循环结束条件,你想一下,对于charAt(0),你是不是要比较数组中的每一个字符的charAt(0)呢,

    那么,自然数组的长度作为里面循环的边界条件。这个应该不难懂的。

  5. 有了这几点,可以写答案了。

三、AC 代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
        int minLen = Integer.MAX_VALUE, len = strs.length, sum = 0;
        for (int i = 0; i < strs.length; i++) {
            minLen = Math.min(minLen, strs[i].length());
        }

        for (int i = 0; i < minLen; i++) {
            char ch = strs[0].charAt(i);
            for (int j = 0; j < len; j++) {
                if (strs[j].charAt(i) != ch) return strs[0].substring(0, sum);
            }
            sum++;
        }
        return strs[0].substring(0, sum);
    }
}

四、总结:

此题虽然是简单题,但是有很多种的方法,我们不能固化思维要多去看看学习学习大佬的解法,比如官方就直接给了4个解法,而我们一般想不到。

范文参考:

画解算法:14. 最长公共前缀 - 最长公共前缀 - 力扣(LeetCode)

代码简洁 一种还不错的解法 - 最长公共前缀 - 力扣(LeetCode)