最长公共前缀
作者:互联网
最长公共前缀
一、题目描述
编写一个函数来查找字符串组中的最长公共前缀。
如果不存在公共前缀则返回“”;
实例:
输入:Strs = ["flower","flow","flight"]
输出:"fl"
输入:strs = ["dog","racecar","car"]
输出:""
二、题目分析
首先排除掉可能出现的特殊情况,如当字符串组为空的情况。再来查找公共部分。这里有三个思路①横向扫描②纵向扫描③排序收尾查找(自己命名的,在评论的思路)
三、解题思路
1、横向扫描
思路:将第一个元素与第二个元素相比较,始终用第一个元素和后面的元素比较,提取公共部分。提取公共部分:提取前两个公共部分(prefix),然后再将prefix与第三个比较依次类推知道比较完。比较原则:取两个字符串中较短一个长度,用来控制两个字符串比较次数,(比较次数肯定要小于最小字符长度);或者字符比较不同的时候。截取相同部分即可。
代码实现:
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){
return "";
}
String prefix = strs[0];
int count = strs.length;
//遍历每一个字符串
for(int i =1 ;i <count ;i++){
//比较获取公共部分
prefix = longestCommonPrefix(prefix, strs[i]);
if(prefix.length() == 0){
return "";
}
}
return prefix;
}
//比较公共部分逻辑
public String longestCommonPrefix(String star1,String star2){
//获取到两字符串最小长度
int length = Math.min(star1.length(),star2.length());
int index = 0;
//判断公共位置点
while( index < length && star1.charAt(index) == star2.charAt(index)){
index++;
}
//截取公共部分
return star1.substring(0,index);
}
2、纵向扫描
思路:比较每一个元素的首个字符,相等则继续比较,不相等则截取公共部分。比较时,如果横向i索引等于比较字符串的长度,直接截取公共部分;例如:["abcdef","abc"] i = 3 ,对应字符等于'd',而第二个比较字符串长度恰好是3,与i相等,则可以直接截取公共部分"abc"。
代码实现:
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0 || strs == null){
return "";
}
int count = strs[0].length();
String str = null;
for(int i = 0; i < count; i++){
for(int j =1 ;j < strs.length ;j++){
//i == strs[j].length() 就是当
if(i == strs[j].length() || strs[j].charAt(i) != strs[0].charAt(i) ){
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
3、排序首位查找
思路:就是将数组排序,只需比较首位两个元素的公共部分即可找到公共前缀。
代码实现:
public String longestCommonPrefix(String[] strs) {
int leng = strs.length;
Arrays.sort(strs,0,leng);
for(int i =0 ; i < strs[0].length(); i++){
if( strs[0].charAt(i) != strs[leng-1].charAt(i)){
return strs[0].substring(0,i);
}
}
return strs[0];
}
标签:return,String,strs,int,length,公共,最长,前缀 来源: https://www.cnblogs.com/zjjtt/p/16487527.html