LeetCode刷题EASY篇寻找多个字符串的最长公共前缀

题目

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

Example 1:

Input: ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

我的尝试

刚开始找到字符串数组中最短的字符串,然后遍历数组,判断每个数组是否startWith最多的字符串。框架已经形成,但是发现如果返回false,需要缩减最短字符串进行判断。在执行缩短代码 minShortString=minShortString.substring(0,minShortString.length()-1);后如何进行重新遍历数组呢?可以while循环,判断缩短后的字符串是否大于0进行循环。另外flag判断while退出刚开始写错了,写在while条件中,怎么也不对。应该放在下面的判断,具体代码:

 if(!flag){
                break;
    }

 

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length<=0){
            return "";
        }
         //找到最短的一个字符串
        String  minShortString=strs[0];
        for(int i=0;istrs[i].length()){
                minShortString=strs[i];
            }
        }
        boolean flag=false;
        while (minShortString.length()>0){
            for(int j=0;j

优化解法

有人提出了利用二分查找,虽然时间复杂度没有提升,但是思路不错,我尝试写了一下:

关键点:

1. 寻找最短的字符串 low =1,high=str.length

2. 公共前缀的长度肯定在low和high之间,采用折半查找,如果前半部分匹配,舍弃前半部分,因为我们寻求最大长度,如果前半部分不匹配,我们舍弃后半部分,因为最长前缀肯定在前半部分

3  折半查找过程中,我们不比较数值,而是比较其他字符串是否startWith当前字符串

class Solution {
    public String longestCommonPrefix(String[] arrays) {
        if(arrays.length==1){
            return arrays[0];
        }
        if(arrays.length==0){
            return "";
        }
        //找到最短的一个字符串
        String  minShortString=arrays[0];
        for(int i=0;iarrays[i].length()){
                minShortString=arrays[i];
            }
        }
        int low=1;
        int high=minShortString.length();
        //公共前缀的长度肯定在low和high之间,采用折半查找,如果前半部分匹配,舍弃前半部分,因为我们寻求最大长度,如果前半部分不匹配,我们舍弃后半部分,因为最长前缀肯定在前半部分
        while (low<=high){
            int mid=(low+high)/2;
            if (isCommonPrefix(arrays,mid,minShortString)){
                low=mid+1;
            }
            else{
                high=mid-1;
            }

        }
        return  minShortString.substring(0,(low+high)/2);
    }
     private static boolean isCommonPrefix(String[] strs, int len,String minShortString){
        String str1 = minShortString.substring(0,len);
        for(int i = 0; i < strs.length; i++) {
            if (!strs[i].startsWith(str1)) {
                return false;
            }
        }
        return true;
    }

}

 

你可能感兴趣的:(架构设计,java常见知识,Leetcode算法)