版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82141995
原题链接:https://leetcode-cn.com/problems/longest-common-prefix/description/
题目描述:
知识点:字符串
思路一:以第一个字符串为基准找最长公共前缀
对于第一个字符串中的每一个字符,都要在后序的字符串中的相应位置找到相同的字符才将该字符加入到最长公共前缀中,只要在后序字符串中相同位置找到了一个不相同的字符,就直接break跳出循环。
该方法的时间复杂度是O(n * m),其中n为最长公共前缀的长度,m为字符串数组的长度。对于空间复杂度是O(1)级别的。
JAVA代码:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0 || strs[0].length() == 0) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strs[0].length(); i++) {
char temp = strs[0].charAt(i);
boolean same = true;
for (int j = 1; j < strs.length; j++) {
if(strs[j].length() <= i || strs[j].charAt(i) != temp) {
same = false;
break;
}
}
if(same) {
stringBuilder.append(temp);
}else {
break;
}
}
return stringBuilder.toString();
}
}
LeetCode解题报告:
思路二:利用递归用分治法实现
我们设置一个递归函数,求数组中从索引left到索引right之间的字符串的最长公共前缀。
递归终止条件:当索引left == 索引right时,此时只有一个字符串,直接返回该字符串。
递归过程:先求出从索引left到索引mid左半边的最长公共前缀,再求出索引mid + 1到索引right右半边的最长公共前缀。再取这两个最长公共前缀的最长公共前缀返回即可。
时间复杂度是O(n * log(m)),其中n为最长公共前缀的长度,m为字符串数组的长度。对于空间复杂度是O(log(m))级别的,因为我们使用了递归分治算法,递归深度就是递归的空间复杂度。
JAVA代码:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0) {
return "";
}
return longestCommonPrefix(strs, 0, strs.length - 1);
}
private String longestCommonPrefix(String[] strs, int left, int right) {
if(left == right) {
return strs[left];
}
int mid = left + (right - left) / 2;
String leftResult = longestCommonPrefix(strs, left, mid);
String rightResult = longestCommonPrefix(strs, mid + 1, right);
int i = 0;
for(; i < leftResult.length(); i++) {
if(rightResult.length() <= i || rightResult.charAt(i) != leftResult.charAt(i)) {
break;
}
}
return leftResult.substring(0, i);
}
}
LeetCode解题报告: