这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
最长公共前缀
该题出自力扣的14题——最长公共前缀(简单题),题解消化于评论
审题
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""。
-
总的来说就是,给一个字符串数组,找出里面字符串的最长公共前缀
-
官方题解有4种方法,横向、纵向、分治、二分
-
最初的想法是,找出数组内的最短字符串(因为最长的公共前缀长度也不过是最短字符串的长度)
- 遍历数组,与每个字符串对比,并计算长度
- 随后便推翻了这个想法,因为找出最短字符串,其实意义不大;因为只要随便找一个数组内的字符串作为标识即可,超出长度即代表后续必然为空
-
最终解决:
- 校验判空
- 遍历数组,只记录最长公共前缀的长度,取数组内首位字符串作为标识,遍历其他作为对比
- 最终用 String . substring 方法去输出;需要注意的是循环内的字段+1或-1;以及最终输出的+1
- 整个思路就是:
- 使用第一个字符串与其他字符串进行逐一对比得出前缀长度;并且所有长度取最小值就是题解
- 相对优化:
- 不用每次都比较整个字符串,只要比较当前的前缀长度即可(因为公共前缀必然越来越小)
- 如果没有公共前缀,那么不需要遍历剩余的字符串
- 相对节省了对整个字符的遍历+存储
编码
public static String longestCommonPrefix(String[] strs) {
if (StringUtils.isEmpty(strs)){
return "";
}
//获取最长公共的前缀
int end = strs[0].length()-1;
for (int i =0;i<strs.length;i++){
//循环字符串
int j =0;
for (;j<=end &&strs[i].length()>j ;j++){
if (strs[0].charAt(j) != strs[i].charAt(j)){
break;
}
}
end = Math.min(end,j-1);
if (end<0){
break;
}
}
return strs[0].substring(0,end+1);
}
- 当前实现方法的时间复杂度是O(m*n),双重for循环
- 空间复杂度是O(1),都是常量