最长公共前缀
1.水平扫描法
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++)
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
return prefix;
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。代码片
笔记:
在while循环中,判断条件的值可以为-1,0,以及其他值。
为-1时,说明当前公共前缀不满足当前字符串,则将前缀长度减一,继续循环
为0时,当前公共前缀正好也是该字符串的前缀,结束该轮循环
为其他值时,说明该公共前缀存在字符串中,但不是前缀,将前缀长度减一,继续循环
2.
采用暴力方法,对所有字符串依次比较
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
String lcp = strs[0];
for(int i = 1; i < strs.length; i++){
if(lcp.length() == 0)
return "";
int j;
for(j = 0; j < Math.min(strs[i].length(), lcp.length()); j++){
if(lcp.charAt(j) != strs[i].charAt(j)){
break;
}
}
lcp = lcp.substring(0,j);
}
return lcp;
}
时间效率不是很高,内存消耗较多(部分原因:代码不精简)
运行结果分析:
3.分治法
分而治之,两两比较
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){
return "";
}else{
return longestCommonPrefix(strs, 0, strs.length - 1);
}
}
private String longestCommonPrefix(String[] strs, int l, int r){
if(l == r){
return strs[l];
} else{
int mid = (l + r)/2;
String leftPrefix = longestCommonPrefix(strs, l, mid);
String rightPrefix = longestCommonPrefix(strs, mid + 1, r);
return commonPrefix(leftPrefix, rightPrefix);
}
}
private String commonPrefix(String leftPrefix, String rightPrefix){
int len = Math.min(leftPrefix.length(), rightPrefix.length());
String ans;
for(int i = 0; i < len; i++){
if(leftPrefix.charAt(i) != rightPrefix.charAt(i)){
return leftPrefix.substring(0, i);
}
}
return leftPrefix.substring(0, len);
}
}
时间效率提高,数据量比较大时更显著。
运行结果分析:
题目来源于leetcode14 ,代码实现部分参考原网站题解