首页 > 技术文章 > leetcode-14.最长公共前缀

yangxiao- 2022-06-10 11:15 原文

题目介绍

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""

示例 1:

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

示例 2:

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

提示:

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

思路

首先想到的就是暴力解法。第一步先寻找字符串数组中长度最短的字符串,并记录下它的长度。然后for循环遍历,依次比较每一个字符,若都相等,则将该字符存入到s中,然后比较下一个字符。不相等就返回s。

代码

public static String longestCommonPrefix_01(String[] strs) {
        int min_length = 1000;
        int strs_length = strs.length;
        int min = 0;
        for (int i = 0; i < strs_length; i++) {
            if (min_length > strs[i].length()){
                min_length = strs[i].length();
                min = i;
            }
        }
        String s = "";
        for (int i = 0; i < min_length; i++) {
            char temp = strs[min].charAt(i);
            for (int j = 0; j < strs_length; j++) {
                if ( temp != strs[j].charAt(i)){
                    return s;
                }
            }
            s += Character.toString(temp);
        }
        return s;
    }

思路二是leetcode一位老哥提供的:公共前缀就意味着每个字符串都拥有该前缀。因此我们先任取一个字符串例如strs[0],然后依次对字符串数组中的每个字符串进行比较,判断字符串str是否以str[0]为开头,然后通过一点一点缩短str[0],直到str[0]是公共前缀或者str[0]长度为0.

例如strs = ["flower","flow","flight"],取"flower"为公共前缀,依次和"flow"、"flight"比较。flow不以flower开头,那么就让flower缩短一个字符,重复下去,直到flower变成了flow。然后和flight比较,flow不是flight的前缀,flow缩短字符变成flo,然后再缩短变成fl。此时fl是flight的前缀。

再例如strs = ["dog","racecar","car"],取"dog"为公共前缀,依次和"racecar","car"比较。racecar不以dog开头,dog缩短一个字符变成do。然后racecar不以do开头,do缩短一个字符变成d。racecar不以d开头,d缩短一个字符变为""。此时str[0]长度为0,说明不存在公共前缀。

代码

public static String longestCommonPrefix_02(String[] strs) {
        // 空数组
        if (strs.length == 0){
            return "";
        }
        String s = strs[0];
        for (String str : strs) {
            while (!str.startsWith(s)){
                if (s.length() == 0){
                    return "";
                }
                // 公告前缀不匹配,就让他变短
                s = s.substring(0,s.length() - 1);
            }
        }
        return s;
    }

推荐阅读