编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
解法一:
- 首先,我们选择字符串数组中的第一个字符串作为初始的最长公共前缀,将其保存在一个变量中(ans)。
- 然后,我们从数组的第二个字符串开始逐个与当前的最长公共前缀进行比较。
- 在比较的过程中,我们从左到右逐个比较对应位置上的字符。如果所有字符串在当前位置上的字符都相等,那么该字符属于最长公共前缀的一部分,我们将其追加到最长公共前缀中。
- 如果在某个位置上,遇到了字符不相等的情况,或者有任何一个字符串到达了末尾,说明最长公共前缀的长度已经达到当前位置,不可能再有更长的公共前缀了,我们可以直接返回最长公共前缀。
- 重复步骤3和步骤4,直到遍历完所有字符串或返回最长公共前缀。
下面是代码示例:
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
StringBuilder ans = new StringBuilder(strs[0]);
for (String str: strs) {
int index = 0;
while (index < ans.length() && index < str.length() && ans.charAt(index) == str.charAt(index)) {
index++;
}
ans.setLength(index);
}
return ans.toString();
}
解法二:
- 初始化一个空字符串ans以存储公共前缀。
- 对字符串数组按字典顺序进行排序。这一步是必要的,因为公共前缀应该对所有字符串都是公共的,所以我们需要在排序列表中找到第一个和最后一个字符串的公共前缀。
- 遍历排序列表中第一个和最后一个字符串的字符,在较短字符串的长度处停止。
- 如果第一个字符串的当前字符不等于最后一个字符串的当前字符,则返回到目前为止找到的公共前缀。
- 否则,将当前字符追加到ans字符串。
- 返回包含最长公共前缀的ans字符串。
下面是代码示例:
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
StringBuilder ans = new StringBuilder();
Arrays.sort(strs); // 按字典顺序进行排序
String first = strs[0];
String last = strs[strs.length-1];
for (int i=0; i<Math.min(first.length(), last.length()); i++) {
if (first.charAt(i) != last.charAt(i)) {
return ans.toString();
}
ans.append(first.charAt(i));
}
return ans.toString();
}
解法一比较中规中矩,解法二是先排序,后找出第一个和最后一个字符串的公共前缀,性能上解法二优于解法一。