题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
示例 2
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
题解
🧐解析:这道题目相比不需要过多解释,寻找最长公共前缀,显然两个 for 循环逐一比较两个字符串,
主要涉及的字符串操作是:1. 字符串比较,2. 子字符串提取
⚡注意:从大多数计算机编程语言的角度来看,字符串和数组本质上是很像的,只不过字符串涉及的操作更多
所以,在进行比较的同时,一定要避免越界访问
🎨比较方式:
-
横向比较
-
纵向比较
🧾参考程序:
class Solution {
public String longestCommonPrefix(String[] strs){
StringBuilder stringBuilder = new StringBuilder();
// 为防止越界访问,将字符串按长度排序
Arrays.sort(strs, (o1, o2) -> o1.length() > o2.length() ? 1 : -1);
// 纵向比较
for (int i=0; i<strs[0].length(); ++i){
char word = strs[0].charAt(i);
for (int j=1; j<strs.length; ++j){
if (strs[j].charAt(i) != word){
return stringBuilder.toString();
}
}
stringBuilder.append(word);
}
return stringBuilder.toString();
}
}
class Solution {
public String longestCommonPrefix2(String[] strs) {
// strs 指向 null,或 strs 数组为空
if (strs == null || strs.length == 0){
return "";
}
char[] Prefix = strs[0].toCharArray();
// prefixCount 最长公共前缀的长度
int prefixCount = Prefix.length;
// 纵向比较
for (int i=0; i<prefixCount; ++i){
for (int j=0; j<strs.length; ++j){
// 预防 String 字符访问越界
if (strs[j].length()-1 < i){
// 更新最长公共前缀长度
prefixCount = i;
break;
}
if (Prefix[i] != strs[j].charAt(i)){
// 更新最长公共前缀长度
prefixCount = i;
break;
}
}
}
return new String(Prefix, 0, prefixCount);
}
}
class Solution {
public String longestCommonPrefix3(String[] strs) {
if (strs == null || strs.length == 0){
return "";
}
String prefix = strs[0];
// 横向比较
for (String s : strs) {
// 这个操作很巧妙的避免越界访问错误
if (prefix.startsWith(s)) {
prefix = s;
continue;
}
for (int i = 0; i < prefix.length(); i++) {
if (s.charAt(i) != prefix.charAt(i)) {
// 每次比较更新最长公共前缀
prefix = new String(prefix.substring(0, i));
break;
}
}
}
return prefix;
}
}
复杂度分析
(参考程序1:时间复杂度由于排序操作,时间复杂度要更大,由于引入了 StringBuilder,因此也增加了空间复杂度)
⏱时间复杂度:O(nm),其中 n 是字符串数组的长度,m 是字符串长度
💿空间复杂度:O(1),并未引用额外的辅助空间
原题链接:https://leetcode-cn.com/problems/longest-common-prefix