题目介绍
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""
。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
思路
首先想到的就是暴力解法。第一步先寻找字符串数组中长度最短的字符串,并记录下它的长度。然后for循环遍历,依次比较每一个字符,若都相等,则将该字符存入到s中,然后比较下一个字符。不相等就返回s。
代码
public static String longestCommonPrefix_01(String[] strs) {
int min_length = 1000;
int strs_length = strs.length;
int min = 0;
for (int i = 0; i < strs_length; i++) {
if (min_length > strs[i].length()){
min_length = strs[i].length();
min = i;
}
}
String s = "";
for (int i = 0; i < min_length; i++) {
char temp = strs[min].charAt(i);
for (int j = 0; j < strs_length; j++) {
if ( temp != strs[j].charAt(i)){
return s;
}
}
s += Character.toString(temp);
}
return s;
}
思路二是leetcode一位老哥提供的:公共前缀就意味着每个字符串都拥有该前缀
。因此我们先任取一个字符串例如strs[0],然后依次对字符串数组中的每个字符串进行比较,判断字符串str是否以str[0]为开头,然后通过一点一点缩短str[0],直到str[0]是公共前缀或者str[0]长度为0.
例如strs = ["flower","flow","flight"],取"flower"为公共前缀,依次和"flow"、"flight"比较。flow不以flower开头,那么就让flower缩短一个字符,重复下去,直到flower变成了flow。然后和flight比较,flow不是flight的前缀,flow缩短字符变成flo,然后再缩短变成fl。此时fl是flight的前缀。
再例如strs = ["dog","racecar","car"],取"dog"为公共前缀,依次和"racecar","car"比较。racecar不以dog开头,dog缩短一个字符变成do。然后racecar不以do开头,do缩短一个字符变成d。racecar不以d开头,d缩短一个字符变为""。此时str[0]长度为0,说明不存在公共前缀。
代码
public static String longestCommonPrefix_02(String[] strs) {
// 空数组
if (strs.length == 0){
return "";
}
String s = strs[0];
for (String str : strs) {
while (!str.startsWith(s)){
if (s.length() == 0){
return "";
}
// 公告前缀不匹配,就让他变短
s = s.substring(0,s.length() - 1);
}
}
return s;
}