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