🐕编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
🐖思路一:
以字符串数组的 第一个元素作为 前缀
遍历 字符串数组 如果 当前前缀不成立 缩短一个字符 周而复始
上代码
public static String longestCommonPrefix(String[] strs) {
if(strs.length == 0) {
return "";
}
//以字符串数组的第一个元素作为 公共前缀
String prefix = strs[0];
//遍历之后的字符串
for(int i = 1 ; i < strs.length ; i++) {
//如果有字符串长度为0 可直接返回 ""
if(strs[i].length() == 0) {
return "";
}
//当有字符串 不以 此 前缀 作为 前缀的话 前缀要缩短一位
while(!strs[i].startsWith(prefix)) {
prefix = prefix.substring(0, prefix.length()-1);
}
}
//最后返回 prefix 有可能是 空字符串 也可能是正确的最长公共前缀
return prefix;
}
🐒思路二:
先找到字符串数组 中 长度最短的那个字符串 并记录他的长度
接下来用长度最短的 字符串 去匹配每个字符串 如果不匹配则长度 -1 继续周而复始 直到 最短长度为0 或 成功退出
上代码
public static String longestCommonPrefix_V2(String[] strs) {
if(strs.length == 0) {
return "";
}
int minLen = Integer.MAX_VALUE;
String minStr = "";
//一次循环 找到 最短长度的字符串 并记录最短长度
for(String str : strs) {
if(str.length() < minLen) {
minLen = str.length();
minStr = str;
}
}
//用最短长度的字符串 匹配其他字符串 如果不匹配则 长度 -1 周而复始
for(String str : strs) {
//有几个 字符串 就遍历几次循环
//一次while下来要不就是找到和第一个str 有公共前缀的minStr 要不就break 匹配下一个字符串
while(minLen > 0) {
//如果当前str 不以 此 minStr作为前缀 minLen 减一 并缩短一位
if(!str.startsWith(minStr)) {
minLen --;
minStr = minStr.substring(0, minLen);
}else{ // 否则可以直接退出
break;
}
}
}
//最后返回 最短字符串 截取 0 到 minLen 有效范围的子字符串即可
return minStr.substring(0,minLen);
}