[14. 最长公共前缀]
难度 简单
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
解法一:横向扫描
用 prefix(S1 ... S2)
表示字符串 S1 ... S2
的最长公共前缀,则
prefix(S1 ... S2) = prefix(prefix(prefix(S1,S2),S3),... Sn)
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0) {
return "";
}
//最开始 最长公共前缀 赋值为第一个字符串
String prefix = strs[0];
for(int i = 1; i < strs.length; i++) {
//依次获取已求得的 最长公共前缀 和 下一个字符串 的最长公共前缀
prefix = getCommonPrefix(prefix, strs[i]);
//如果 prefix 的长度为 0, 则无最长公共前缀
if(prefix.length() == 0) {
return "";
}
}
return prefix;
}
private String getCommonPrefix(String s1, String s2) {
int len = Math.min(s1.length(), s2.length());
for (int i = 0; i < len; i++) {
if (s1.charAt(i) != s2.charAt(i)) {
return s1.substring(0, i);
}
}
return s1.substring(0, len);
}
}
解法二:纵向扫描
依次比较 第一个字符串 与 其它字符串 每一个位置的字符
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
int len = strs[0].length();
//依次比较 第一个字符串 与 其它字符串 的每一个位置的字符
for (int i = 0; i < len; i++) {
//获取 第一个字符串 第 i 个位置的字符
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j++) {
//如果 已经比较到 第一个字符串 最后一个字符 或者 两者不相等, 则返回 i 位置之前的字符串
if (i == strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}
解法三:分治法
用 prefix(S1 ... S2)
表示字符串 S1 ... S2
的最长公共前缀,则
prefix(S1 ... S2) = prefix(prefix(S1 ... Smid),prefix(Smid+1 ... Sn))
,
同理 prefix(S1 ... Smid) = prefix(prefix(S1 ... S(mid-1)/2),prefix(S(mid-1)/2 + 1 ... Smid))
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
} else {
return longestCommonPrefix(strs, 0, strs.length - 1);
}
}
public String longestCommonPrefix(String[] strs, int start, int end) {
if (start == end) {
return strs[start];
} else {
int mid = (end - start) / 2 + start;
String lcpLeft = longestCommonPrefix(strs, start, mid);
String lcpRight = longestCommonPrefix(strs, mid + 1, end);
return getCommonPrefix(lcpLeft, lcpRight);
}
}
private String getCommonPrefix(String s1, String s2) {
int len = Math.min(s1.length(), s2.length());
for (int i = 0; i < len; i++) {
if (s1.charAt(i) != s2.charAt(i)) {
return s1.substring(0, i);
}
}
return s1.substring(0, len);
}
}