最长公共前缀
分治法、递归
题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
Related Topics
字典树
字符串
👍 2806
👎 0
class Solution {
public String longestCommonPrefix(String[] strs) {
}
}
思路
- 去数组中第一个元素的各个字符与数组中其他元素对比
- 需要注意数组界限判断,两个指针,index代表字符串的第几个,i代表数组中第几个元素
实现
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length==0) return "";
if (strs.length==1) return strs[0];
int index =0;
if (strs[0].length()==0) return "";
int i=1;
while (true){
if (strs[0].length()==index){
return strs[0];
}
if (strs[i].length()==index){
return strs[i];
}
char compareChar = strs[0].charAt(index);
if (compareChar!=strs[i].charAt(index)){
return strs[0].substring(0,index);
}
i++;
if (i==strs.length){
index++;
i=1;
}
}
}
}
结果
解答成功:
执行耗时:1 ms,击败了68.69% 的Java用户
内存消耗:39.3 MB,击败了61.33% 的Java用户
思路
- 判断有点多
- 可以使用for循环+while双层循环
优化2
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length==0) return "";
if (strs.length==1) return strs[0];
int index =0;
while (true){
char temp=0;
for (int i=0;i<strs.length;i++){
if (strs[i].length()==index){
return strs[i];
}
if (temp==0){
temp=strs[i].charAt(index);
}
if (strs[i].charAt(index)!=temp){
return strs[0].substring(0,index);
}
}
index++;
}
}
}
结果
解答成功:
执行耗时:1 ms,击败了68.69% 的Java用户
内存消耗:39.2 MB,击败了83.30% 的Java用户
思路
发现并没有多少提升,查看大佬解答后发现采用分治法
优化3
public String longestCommonPrefix(String[] strs) {
if (strs.length==0) return "";
if (strs.length==1) return strs[0];
return splitStrings(strs,0,strs.length-1);
}
private String splitStrings(String[] strings,int start,int end){
//何时退出递归
if (start==end){
return strings[start];
}
int mid = (start+end)/2;
//递归
return maxSameString(splitStrings(strings,start,mid),splitStrings(strings,mid+1,end));
}
//最长公共前缀
private String maxSameString(String s1,String s2){
if (s1=="" || s2==""){
return "";
}
int minLen = s1.length()<s2.length()?s1.length():s2.length();
for (int i=0;i<minLen;i++){
if (s1.charAt(i)!=s2.charAt(i)){
return s1.substring(0,i);
}
}
return s1.length()<s2.length()?s1:s2;
}
结果
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:38.9 MB,击败了98.23% 的Java用户
思路
采用递归法,把数组切割为小块,每个小块再对比寻找最大公共前缀。