最长公共前缀
题目链接:
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,返回它
}
}