「优选算法刷题」:最长公共前缀(两种解法)

25 阅读2分钟

一、题目

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

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

示例 1:

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

示例 2:

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

提示:

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

二、思路解析

本篇博客我将会讲解这道题的两种解法👇

解法一:两两比较

这种方法的思路是从第一个字符串开始,逐个字符与其他字符串进行比较,直到找到最长公共前缀或者出现不匹配(在这道题指的是超出数组长度)的情况。

具体思路请看下图,方便大家理解:

编辑

解法二:统一比较

第二种解法则是使用一个辅助函数 findCommon 来寻找两个字符串的公共前缀,然后逐个对比所有字符串的公共前缀。

算法思路请看下图,其中 i 为遍历 strs[ 0 ] 的变量, j 为遍历 strs 的变量。

编辑

然后,我们首先取第一个字符串作为初始公共前缀 ret,然后用 findCommon 函数找到当前字符串与 ret 的公共前缀,依次更新 ret 直到遍历完所有字符串。

三、完整代码

class Solution {
    public String longestCommonPrefix(String[] strs) {

        for(int i = 0; i < strs[0].length(); i++){
            char tmp = strs[0].charAt(i);
            for(int j = 0; j <strs.length; j++){
                if(i == strs[j].length() || strs[j].charAt(i) != tmp){
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }


    //     // 解法一
    //     String ret = strs[0];
    //     for(int i = 0; i < strs.length; i++){
    //         ret = findCommon(strs[i], ret);
    //     }
    //     return ret;
    // }

    // public String findCommon(String s1, String s2){
    //     int i = 0;
    //     while(i < Math.min(s1.length(), s2.length()) && s1.charAt(i) == s2.charAt(i)){
    //         i++;
    //     }
    //     return s1.substring(0, i);
    // }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!