题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
我的思路
很简单,选一个最短的字符串作为基准,然后依此与每个字符串比较,找出最长前缀,然后依此前缀对后一个进行比较,比较玩为止。
我的代码
//最长公共前缀
public class problem14 {
public String longestCommonPrefix(String[] strs) {
//特判
if(strs.length==0) return "";
if(strs.length==1) return strs[0];
String res=strs[0];
//首先找到长度最短的一个字符串,这有助于在数据量大时减少时间
int length=strs[0].length();
for(int i=0;i<strs.length;i++){
if(length>strs[i].length()){
length=strs[i].length();
res=strs[i];
if(res=="") return "";
}
}
for(int i=0;i<strs.length;i++){
res=search(res, strs[i]);
// System.out.println(res);
}
return res;
}
//寻找最长公共前缀
public String search(String str1,String str2){
StringBuilder strbu=new StringBuilder();
for(int i=0;i<str1.length()&&i<str2.length();i++){
if(str1.charAt(i)==str2.charAt(i)){
strbu.append(str1.charAt(i));
}else{
break;
}
}
return strbu.toString();
}
public static void main(String[] args) {
problem14 pro=new problem14();
String[] strs={"flower","flow","flight"};
System.out.println(pro.longestCommonPrefix(strs));
}
}
大佬的代码(思路写在注释里的)
public class problem14_2 {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
String prefix = strs[0];
//思路,以第一个字符串为基准,对以后的字符串进行查找
//查找第一个字符串是否是其实字符串的前缀,
//对于每个字符串,如果是,则继续向下一个字符串查找
//如果不是,则把第一个字符串的字符减去最后一个,重复查找操作,知道找到或者字符串减为空
for (int i = 1; i < strs.length; i++)
//int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引
//如果此字符串中没有这样的字符,则返回 -1。
while (strs[i].indexOf(prefix) != 0) {
//public String substring(int beginIndex, int endIndex)
//beginIndex -- 起始索引(包括), 索引从 0 开始。
//endIndex -- 结束索引(不包括)
System.out.println(prefix);
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty())
return "";
}
return prefix;
}
public static void main(String[] args) {
problem14_2 pro = new problem14_2();
String[] strs = { "flower", "flow", "flight" };
System.out.println(pro.longestCommonPrefix(strs));
}
}
其实思路没什么区别,但很明显大佬的代码比我的简单了太多,
不过跑出来结果也差不多,主要就是对java的熟悉程度的问题