【问题描述】[中等]
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入: ["flower","flow","flight"]
输出: "fl"
示例 2:输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。
【解答思路】
1. 横向扫描
时间复杂度:O(N^2) 空间复杂度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}String prefix
= strs
[0];int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {prefix
= longestCommonPrefix(prefix
, strs
[i
]);if (prefix
.length() == 0) {break;}}return prefix
;}public String
longestCommonPrefix(String str1
, String str2
) {int length
= Math
.min(str1
.length(), str2
.length());int index
= 0;while (index
< length
&& str1
.charAt(index
) == str2
.charAt(index
)) {index
++;}return str1
.substring(0, index
);}
}
2. 纵向扫描
时间复杂度:O(N^2) 空间复杂度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int length
= strs
[0].length();int count
= strs
.length
;for (int i
= 0; i
< length
; i
++) {char c
= strs
[0].charAt(i
);for (int j
= 1; j
< count
; j
++) {if (i
== strs
[j
].length() || strs
[j
].charAt(i
) != c
) {return strs
[0].substring(0, i
);}}}return strs
[0];}
}
public String
longestCommonPrefix(String
[] strs
) {if (strs
.length
== 0) return "";for(int i
= 0;i
<strs
[0].length();++i
){for(int j
=1 ; j
<strs
.length
;j
++){if(i
== strs
[j
].length() || strs
[j
].charAt(i
)!=strs
[0].charAt(i
)){return strs
[0].substring(0,i
);}}}return strs
[0];}
2. 二分法
时间复杂度:O(mnlogm) 空间复杂度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int minLength
= Integer
.MAX_VALUE
;for (String str
: strs
) {minLength
= Math
.min(minLength
, str
.length());}int low
= 0, high
= minLength
;while (low
< high
) {int mid
= (high
- low
+ 1) / 2 + low
;if (isCommonPrefix(strs
, mid
)) {low
= mid
;} else {high
= mid
- 1;}}return strs
[0].substring(0, low
);}public boolean isCommonPrefix(String
[] strs
, int length
) {String str0
= strs
[0].substring(0, length
);int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {String str
= strs
[i
];for (int j
= 0; j
< length
; j
++) {if (str0
.charAt(j
) != str
.charAt(j
)) {return false;}}}return true;}
}
4. 分治
复杂度
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int minLength
= Integer
.MAX_VALUE
;for (String str
: strs
) {minLength
= Math
.min(minLength
, str
.length());}int low
= 0, high
= minLength
;while (low
< high
) {int mid
= (high
- low
+ 1) / 2 + low
;if (isCommonPrefix(strs
, mid
)) {low
= mid
;} else {high
= mid
- 1;}}return strs
[0].substring(0, low
);}public boolean isCommonPrefix(String
[] strs
, int length
) {String str0
= strs
[0].substring(0, length
);int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {String str
= strs
[i
];for (int j
= 0; j
< length
; j
++) {if (str0
.charAt(j
) != str
.charAt(j
)) {return false;}}}return true;}
}
【总结】
1.纵横交错 二分分治
2. 字符串/数组题目遍历 暴力再优化
转载链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/
总结
以上是生活随笔为你收集整理的[Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。