Leecode简单-最长公共前缀判断

115 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

题目描述

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

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

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

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

 提示:

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

解法1-纵向比较

第一眼就想到的方法

思路就是以第一个字符串为标准,循环这个字符串的每一个字符,与其他字符串对应的位置的字符作比较,只要有一个对不上就结束,返回前面匹配到的字符

class Solution {
    public String longestCommonPrefix(String[] strs) {  
        StringBuilder commonStrBulider = new StringBuilder("");      
        String firstStr = strs[0];
        for(int i=0;i<firstStr.length();i++){
            for(int j=1;j<strs.length;j++){
                if(strs[j].length()<=i || firstStr.charAt(i)!=strs[j].charAt(i)){
                    return commonStrBulider.toString();
                }
            }
            commonStrBulider.append(firstStr.charAt(i));
        }

        return commonStrBulider.toString();
    }
}

时间复杂度为O(mn) 取决于字符串数组的长度和字符串的长度

空间复杂度O(1)

解法2-横向比较

看过题解后:

思路与纵向比较基本相同,但是不同的是横向比较先比较前两个字符串,取出公共前缀后,拿公共前缀与第三个字符串比较得出新的公共前缀,再以此类推.

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int length = strs.length;
        String prefix = strs[0];
        for (int i = 1; i < length; i++) {
            String tempStr = strs[i];
            int min = Math.min(prefix.length(), tempStr.length());
            int j = 0;
            while(j<min && prefix.charAt(j)==tempStr.charAt(j)){
                j++;
            }
            prefix = tempStr.substring(0, j);
        }
        return prefix;
    }
}

效率是差不多的

空间复杂度和时间复杂度与纵向比较是一样的.

题解中还给出了另外两种解法分治二分查找

但是对于这个简单问题来说,这两种方法个人感觉将问题复杂化,并且没有提高效率,反而增加空间复杂度,感兴趣的可以看一下题解