zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    MySQL的备份和恢复-mysqldump
    MySQL日志功能详解
    MySQL查询缓存
    MySQL的用户管理
    doc常用命令
    记录mysql语句
    centos常用命令
    centos 7.6
    centos6 常用命令
    centos6.8 安装软件
  • 原文地址:https://www.cnblogs.com/raychou1995/p/10434714.html
Copyright © 2011-2022 走看看