1.题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200 strs[i]
- 仅由小写英文字母组成
2.答题
思路1:
- 把第一个字符串的前缀都缓存下来
- 循环后续字符串是否包含其中的值,并保存最大的序号
- 结束条件
代码如下:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length <= 0) {
return "";
}
String first = strs[0];
List<String> preList = new ArrayList<>(first.length());
for (int i = 0; i < first.length(); i++) {
preList.add(first.substring(0, i + 1));
}
int max = -1;
for (int i = 1; i < strs.length; i++) {
int tmpMax = -1;
String str = strs[i];
for (int j = 0; j < preList.size(); j++) {
if (str.startsWith(preList.get(j))) {
tmpMax = i;
} else {
break;
}
}
if (tmpMax == -1) {//没有匹配成功的前缀,直接结束
max = -1;
break;
}
if (max == -1) {
max = tmpMax;
} else {
max = Math.min(max, tmpMax);
}
}
return max == -1 ? "" : preList.get(max);
}
}
时间复杂度
遍历第一个元素是O(m),循环嵌套是O(nm),总体来说是O(m+mn)
提交结果
这种写法比较乱,可以尝试一下步骤:
- 循环字符串,对比是否以第一个元素开头
- 是,继续执行,知道循环结束
- 否,将第一个元素缩减一位
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length <= 0) {
return "";
}
String publicStr = strs[0];
while (publicStr.length() != 0) {
boolean flag = true;
for (int i = 1; i < strs.length; i++) {
if (!strs[i].startsWith(publicStr)) {
publicStr = publicStr.substring(0, publicStr.length() - 1);
flag = false;
break;
}
}
if (flag) {
return publicStr;
}
}
return "";
}
}
提交结果
解法和上面基本相同,至少稍微简化了一点代码,再压榨一下,有木有其他解决方法,待以后水平高了再想吧gg