leetcode-第14题 最长公共前缀

题目:

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

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

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

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

所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix

思路:

        这个题也很简单,只需要拿第一个字符串的每一个字符依次去和其他字符串比较,直到越界或者不再全部相同为止。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length < 1) return "";
        if (strs.length == 1) return strs[0];

        StringBuilder result = new StringBuilder();
        boolean equal = true;
        // 遍历第一个字符串的每一个字符
        for (int i = 0; equal && i < strs[0].length(); i++) {
            char currentChar = strs[0].charAt(i);
            // 比对其他字符串的相同位置的字符是否相同
            for (int j = 1; equal && j < strs.length; j++) {
                if (strs[j].length() <= i || currentChar != strs[j].charAt(i)) {
                    equal = false;
                }
            }
            if (equal) {
                result.append(currentChar);
            }
        }
        return result.toString();
    }
}

时间复杂度:O(mn),m是字符串的个数,n是字符串的最短长度

空间复杂度:O(1)

官方解法:

        上面的方法我认为应该是最优解法了,官方将这个解法命名为纵向扫描;还有横向扫描,也就是先比较两个,得出一个公共前缀,再拿这个公共前缀和第三个字符比较……如此下去,比对完所有字符串之后得到的就是整体的公共前缀了。

        上面的横向扫描,其实也能进一步想到可以用分治法,两两对比得结果,然后再两两对比。

        还有一个“二分查找”的方法我没仔细看。

        但是,我认为上面这些方法并没有实际上降低计算的复杂度,只是从不同角度来解决问题而已。所以对于一个如此简单的问题,其实没必要搞得过于复杂。纵向扫描解决就好了。

 

耗时:20分钟

 

 

 

你可能感兴趣的:(算法,leetcode,最长公共前缀)