14、最长公共前缀子串
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
- 说明:
所有输入只包含小写字母 a-z
。
题解
1、纵向扫描
class Solution {
public String longestCommonPrefix(String[] strs) {
// 异常处理
if (strs == null || strs.length == 0) {return "";}
// 循环遍历
for (int i = 0;i < strs[0].length();i++) {
char c = strs[0].charAt(i);
for (int j =1;j < strs.length;j++) {
if (i == strs[j].length() || strs[j].charAt(i) != c) {// 到达结尾 或者 字符不等
return strs[0].substring(0,i);
}
}
}
// 返回结果
return strs[0];
}
}
2、横向扫描
class Solution {
public String longestCommonPrefix(String[] strs) {
// 异常判断
if (strs.length == 0) {return "";}
// 取第一个字符串
String prefix = strs[0];
// 遍历判断
for (int i = 1;i < strs.length;++i) {// 遍历剩余字符串
while (strs[i].indexOf(prefix) != 0) {// 字符串i的字串prefix第一次出现的索引不为0
prefix = prefix.substring(0,prefix.length() - 1);// 更新字串,将字符串的长度剪1
if (prefix.isEmpty()) return "";// 减到最后一个都没有公共字串,直接return 空
}
}
//返回结果
return prefix;
}
}
3、分治——二分横向扫描
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
} else {
return longestCommonPrefix(strs,0,strs.length - 1);
}
}
private String longestCommonPrefix(String[] strs,int start,int end) {
if (start == end) {
return strs[start];
} else {
// 二分递归
int mid = (end - start) / 2 + start;
String lcpLeft = longestCommonPrefix(strs,start,mid);
String lcpRight = longestCommonPrefix(strs,mid + 1,end);
return commonPrefix(lcpLeft,lcpRight);
}
}
private String commonPrefix(String lcpLeft,String lcpRight) {
int minLength = Math.min(lcpLeft.length(),lcpRight.length());
for (int i = 0;i < minLength;i++) {
if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
return lcpLeft.substring(0,i);
}
}
return lcpLeft.substring(0,minLength);
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com