14.最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
解法一:用前缀树
class Solution {
public String longestCommonPrefix(String[] strs) {
Tire tire=new Tire();
int size=strs.length;
for(String str:strs){
tire.insert(str);
}
String flagStr=strs[0];
String result="";
String find="";
for(int j=0;j<flagStr.length();j++){
find+=flagStr.charAt(j);
int pass=tire.getPreNumber(find);
if(pass==size){
result+=flagStr.charAt(j);
}
}
return result;
}
public class TireNode{
public int pass;
public int end;
public TireNode[] nexts=new TireNode[26];
}
public class Tire{
private TireNode root;
public Tire(){
root=new TireNode();
}
public void insert(String word){
if(word==null){
return;
}
TireNode node=root;
node.pass++;
int index=0;
char[] chs=word.toCharArray();
for(int i=0;i<chs.length;i++){
index=chs[i]-'a';
if(node.nexts[index]==null){
node.nexts[index]=new TireNode();
}
node=node.nexts[index];
node.pass++;
}
node.end++;
}
public int getPreNumber(String word){
if(word==null){
return 0;
}
char[] chs=word.toCharArray();
int index=0;
TireNode node=root;
for(int i=0;i<chs.length;i++){
index=chs[i]-'a';
if(node.nexts[index]==null){
return 0;
}
node=node.nexts[index];
}
return node.pass;
}
}
}
解法二:先求两个字符串的最大公公前缀,如果没有直接结束,如果有将之前求的最大前缀缀和下一个字符串继续比较每个字符
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs==null||strs.length==0){
return "";
}
String prefix=strs[0];
for(int i=1;i<strs.length;i++){
prefix=getLongestPrefix(prefix,strs[i]);
if(prefix.length()==0){//如果prefix的长度为0,提前结束
return "";
}
}
return prefix;
}
public String getLongestPrefix(String str1,String str2){
if(str1==null || str2==null){
return "";
}
int minLength=Math.min(str1.length(),str2.length());
int index=0;
for(int i=0;i<minLength;i++){
if(str1.charAt(i)==str2.charAt(i)){
index++;
}else{//一遇到没有匹配的直接结束循环
break;
}
}
return str1.substring(0,index);
}
}

浙公网安备 33010602011771号