一、题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例:
输入:strs = ["flower","flow","flight"]
输出:"fl"
二、解题方法
方法一:横向比较
1.思路:
字符串两个两个的比较,比如先判断flower和flow得到flow,再将flow和flight比较得到fl
2.代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0||strs==null){
return "";//数组为空和数组长度为0的情况都没有公共前缀
}
String prefix=strs[0];
int num=strs.length;//用变量num表示数组中字符串的个数
for(int i=1;i<num;i++){
prefix=longestCommonPrefix(prefix,strs[i]);//再定义一个函数比较每两个字符串中相同的前缀
}
return prefix;
}
public String longestCommonPrefix(String a,String b){
int length=Math.min(a.length(),b.length());//利用Math.min()求出其中最小的
int i=0;
while(i<length&&a.charAt(i)==b.charAt(i)){
i++;
}
return a.substring(0,i);
}
}
3.补充
数组为空和数组长度为0不一样,例如String[ ]a={ }不为空,但是其长度为0,因为{ }开辟了内存空间,再例如String[ ]b=null没开辟内存空间(即也没有给数组赋初值)则数组为空,没有数组长度。综上数组长度为0但数组不一定为空。
关于length后是否带括号,在处理字符串时需要加括号代表使用函数处理,用字符串.length( )表示,处理的是数字时,可不带括号,因为String类型内部带有length( )函数,这时可直接调用其属性,用数组.length表示
Java中substring(start,end)的使用,从start开始,返回从start到end的字符串,但是不包含end索引位置的字符
在Java中定义函数,可以定义函数名相同,但是函数参数不同的函数,在C++中也可以,但是在C语言中不行
方法二:纵向比较
1.思路:依次比较每个字符串的每个字符
2.代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0&&strs==null)
return "";
for(int i=0;i<strs[0].length();i++){//第一个for表示与数组中第一个字符串的各个字符比较
char a=strs[0].charAt(i);
for(int j=1;j<strs.length;j++){//第二个for表示比较数组中每个字符串
if(i==strs[j].length()||a!=strs[j].charAt(i))//注意两个条件位置不能交换,否则会报错,出现String index out of range的错误,因为否则i==strs[j].length将未能及时对charAt(i)进行终止
return strs[0].substring(0,i);
}
}
return strs[0];
}
}
3、补充:
substring(0,0)截取不到字符串,返回和“”的结果一样,即如果字符串中没有公共前缀则能正确返回
一个更快的思路,可以先找到最短的字符串然后再比较
题目来源:力扣
解题思路参考:力扣官方题解