publicStringlongestCommonPrefix(String[] strs){if(strs ==null|| strs.length ==0){return"";}int right =Integer.MAX_VALUE;for(String str : strs){
right =Math.min(str.length(), right);}int left =0;while(left < right){int mid =(right - left +1)/2+ left;if(isCommonPrefix(strs, mid, left)){
left = mid;continue;}
right = mid -1;}return strs[0].substring(0, left);}privatebooleanisCommonPrefix(String[] strs,int end,int start){String str = strs[0].substring(0, end);for(int i =1; i < strs.length; i++){String str1 = strs[i];for(int j = start; j < end; j++){if(str.charAt(j)!= str1.charAt(j)){returnfalse;}}}returntrue;}
go
funclongestCommonPrefix(strs []string)string{if strs ==nil||len(strs)==0{return""}
right := math.MaxInt32
for_, v :=range strs {
right =getMin(len(v), right)}
left :=0for left < right {
mid :=(right-left+1)/2+ left
ifisCommonPrefix(&strs, mid, left){
left = mid
continue}
right = mid -1}return strs[0][0:left]}funcisCommonPrefix(strs *[]string, end, start int)bool{
str :=(*strs)[0]for i :=1; i <len(*strs); i++{
str1 :=(*strs)[i]for j := start; j < end; j++{if str[j]!= str1[j]{returnfalse}}}returntrue}funcgetMin(a, b int)int{if a > b {return b
}return a
}
题目链接思路使用二分查找来找出最长公共前缀初始化left和right;left为0;right只能为数组中长度最短的字符串长度;最长的公共前缀长度也一定小于等于right循环;结束条件:left>right求出mid;使用判断left到mid这段子串是否为数组中的公共子串是公共子串:将left置为mid不是公共子串:将right置为mid-1最后0到left就是数组中的最长公共前缀;取出一个元素截取返回java public String longestCommon