Leetcode-easy-2 Longest common prefix
Qusetion
- Write a function to find the longest common prefix string amongst an array of strings.
Solution 1 Horizontal scanning
作为算法小白,第一个想到的就是这种方法了。只要遍历比较全部数组中的字符串即可。
public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
if(strs.length == 1){
return strs[0];
}
String prefix = strs[0];
for(int i=1;i<strs.length;i++){
if(strs[i].length() == 0){
return "";
}
prefix = getCommonPrefix(prefix,strs[i]);
}
return prefix;
}
public String getCommonPrefix(String prefix, String string){
String result="";
int round = (prefix.length()<string.length())?prefix.length():string.length();
for(int i =0;i<round; i++){
if(prefix.charAt(i)==string.charAt(i)){
result += prefix.charAt(i);
}else{
return result;
}
}
return result;
}
}
当然所用时间相当的长,22ms
Solution 2 Devide and Conquer
leetcode 的方法之一,基本想法是对数组二分比较。
public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length ==0 || strs == null){
return "";
}
return getPrefix(strs, 0, strs.length-1);
}
public String getPrefix(String[] strs, int l, int r){
if(l == r){
return strs[l];
}
int pivot = (l + r)/2;
String left = getPrefix(strs, l, pivot);
String right = getPrefix(strs, pivot+1, r);
return getCommonPrefix(left, right);
}
public String getCommonPrefix(String left, String right){
int maxPrefixLength = Math.min(left.length(), right.length());
for(int i= 0;i<maxPrefixLength;i++){
if(left.charAt(i)!= right.charAt(i)){
return left.substring(0,i);
}
}
return left.substring(0,maxPrefixLength);
}
}
实测用时15ms
Solution 3 Binary
leetcode方法之一,对第一个字符串二分不断同后面的匹配。
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0)
return "";
int minLen = Integer.MAX_VALUE;
for (String str : strs)
minLen = Math.min(minLen, str.length());
int low = 1;
int high = minLen;
while (low <= high) {
int middle = (low + high) / 2;
if (isCommonPrefix(strs, middle))
low = middle + 1;
else
high = middle - 1;
}
return strs[0].substring(0, (low + high) / 2);
}
private boolean isCommonPrefix(String[] strs, int len){
String str1 = strs[0].substring(0,len);
for (int i = 1; i < strs.length; i++)
if (!strs[i].startsWith(str1))
return false;
return true;
}