Java语言实现查找最长前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:

所有输入只包含小写字母 a-z 。

1、首先使用暴力解法,排序后水平查找

class Solution {
    public String longestCommonPrefix(String[] strs) {
      //判断是否为空串
      if(strs=null||strs.length==0) return "";
      //数组按照字符顺序排序
      List<String> list = Arrays.asList(strs);
      Collections.sort(list);
      //声明一个公共前缀
      String prefix="";
      //暴力for循环
      outerloop:for(int i=0;i<list.get(0).length();i++)
      {
        String tmp=list.get(0).substring(0,i+1);
          for(int j=0;j<list.size();j++){
              if(!tmp.equals(list.get(j).substring(0,i+1))){
                  break outerloop;
              }
              if(j==list.size()-1){
                prefix=list.get(0).substring(0,i+1);
            }
          }
      }
      //返回公共前缀
      return prefix;
    }
}

暴力解法里面用到了以下内容:Arrays.asList将字符串数组转化为list列表,然后利用集合排序的方法对字符串进行了排序;

2、使用分治思想,二分查找

class Solution {
    public String longestCommonPrefix(String[] strs) {
        //判断是否为空串
        if(strs=null||strs.length==0) return "";
        //找到最短的字符串的长度
        int minLen=Integer.MAX_VALUE;
        for(String str;strs){
            minLen=Math.min(str.length(),minLen);
        }
        int fisrt=1;
        int last=minLen;
        while(fisrt<=last){
            //找到中间位置
            int middle=(fisrt+last)/2;
            if(isCommonPrefix(strs,middle)){
            //前半串是公共子串,则从前半串+1位继续查找
                first=middle+1;
            }else{
            //前半串不是公共子串,则从前半串-1位继续查找
                last=middle-1;
            }
        }
        
        return strs[0].substring(0, last);
    }
    //判断第一个字符串的前len是否为所有串的子串
    public boolean isCommonPrefix(String[] strs,int len){
        String tmp=strs[0].substring(0,len);
        for(int i=1;i<strs.length;i++){
            if(!strs[i].startsWith(tmp))
                return false;
            return true;
        }
    }
}

二分解法里面用到了以下内容:字符串的startsWith方法,包装类获取常量值Integer.MAX_VALUE



posted @ 2019-02-26 12:58  RayChou1995  阅读(866)  评论(0编辑  收藏  举报