最长公共前缀 LeetCode14

最长公共前缀


题目链接:

https://leetcode-cn.com/problems/longest-common-prefix/

题目描述

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

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

示例:

示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”

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

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

解决方案

思路 1:时间复杂度: O(N * len(strs(0)) 空间复杂度: O(N)

一共有 N 个字符串,题目要求我们求它们的公共前缀(还得是最长的)。那么此时假设我们已经知道前 i+1 个字符串的最长公共前缀(dp[i])了,此时再来一个字符串(即第 i+2 个字符串)。我们需要做什么呢?如果第i+2 个字符串不以 dp[i] 为前缀,就去掉 dp[i] 的最后一个字符再试一次。假如都去完了呢?那么最后结果就是空串。

下面来看具体的代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) {
            return "";
        }
        // 最长字串的长度一定不会超过第 0 个字符串的长度
        int end = strs[0].length();
        for (int i = 1; i < strs.length; i++){
            int j = 0;
            while (j < end && j < strs[i].length() && strs[0].charAt(j) == strs[i].charAt(j)) {
                j++;
            }
            end = j;
        }
        return strs[0].substring(0,end);
    }
}

思路 2:时间复杂度: O(N * len(strs(0)) 空间复杂度: O(1)

在思路 1 中我们还需要记录每一步骤的状态,所以空间复杂度为 O(N),我们能否不要额外空间呢?

下面来看具体的代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) {
            return "";
        }
        for (int i = 0; i < strs[0].length(); i++) {
            // 第 0 个字符不需要比较,可以直接从第 1 个字符开始进比较
            for (int j = 1; j < strs.length; j++) {
	        // 只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i]
		// 只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i]
                if (i >= strs[j].length() || strs[0].charAt(i) != strs[j].charAt(i)) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0]; // 如果一直没返回,说明strs[0]本身就是LCP,返回它
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法)