题目:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例:
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
题解:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){
return "";
}
String str = strs[0];
int len = strs.length;
for(int i = 1;i < len;i++) {
str = longestCommonPrefix(str,strs[i]);
}
return str;
}
public String longestCommonPrefix(String str1,String str2) {
int len = Math.min(str1.length(),str2.length());
int index = 0;
while(index < len && str1.charAt(index) == str2.charAt(index)) {
index++;
}
return str1.substring(0,index);
}
}
解题思路:
这段代码定义了一个Solution
类,其中包含两个方法,用于解决“最长公共前缀”的问题。问题的核心是给定一个字符串数组,找出这些字符串的最长公共前缀。
- 边界情况处理:
- 首先,在
longestCommonPrefix(String[] strs)
方法中,代码检查了输入数组strs
是否为空或长度为0。如果是,则直接返回空字符串,因为没有任何字符串可以形成公共前缀。
- 首先,在
- 递归调用:
- 接着,代码取数组中的第一个字符串
strs[0]
作为基准字符串str
。 - 然后,通过循环遍历数组中的剩余字符串(从索引1开始),每次递归调用
longestCommonPrefix(String str1, String str2)
方法,将基准字符串str
与当前遍历到的字符串strs[i]
进行比较,并更新str
为它们之间的最长公共前缀。
- 接着,代码取数组中的第一个字符串
- 计算最长公共前缀:
- 在
longestCommonPrefix(String str1, String str2)
方法中,代码首先获取两个字符串str1
和str2
的较短长度作为循环的上限len
。 - 然后,使用一个
while
循环逐个比较两个字符串的字符,直到找到不同的字符或到达字符串的末尾。 - 循环中,如果两个字符串的当前字符相同,则
index
递增。 - 循环结束后,使用
substring
方法从str1
中提取从索引0到index-1
的子字符串,即为两个字符串的最长公共前缀。
- 在
总结:
这段代码通过递归和循环的方式有效地解决了最长公共前缀的问题。它首先处理边界情况,然后通过一个递归的框架,将问题分解为计算两个字符串的最长公共前缀,并逐步缩小问题的规模。最终,它能够准确地返回输入字符串数组的最长公共前缀。
需要注意的是,虽然递归在逻辑上很清晰,但在处理大型数据集时可能会导致栈溢出或性能下降。因此,在实际应用中,可能需要考虑使用迭代或动态规划等更高效的方法来解决类似问题。本方法对于时间复杂度为O(mn),已经较为优秀的算法。