Solution 1:自己的暴力解法(拿字符串数组的第一个字符串的每一个字母去匹配后面,看是不是字符串数组里每个字符串里都有这个字母,如果有一个字符串里没有这个字母,那么退出循环,此时res就是最长的prefix)
还挺简单的,一次就AC了
T=O(strs[0].length())
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0||strs==null) return "";
int k=0;
String res="";
while(k<strs[0].length()){
int flg=0;
char a=strs[0].charAt(k);
for(int i=0;i<strs.length;i++){
if(k>=strs[i].length()||strs[i].charAt(k)!=a){
flg=1;
break;
}
}
if(flg==0){
k++;
res+=a;
}
else{
break;
}
}
return res;
}
}
然后看了看答案,这就是答案的solution2:vertical scanning
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];
}
Solution 2:Horizontal scanning
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) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
return prefix;
}
SOLUTION 3: DIVIDE&CONQUER 1
对strs整个数组进行分支和递归
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0||strs==null) return "";
int left=0;
int right=strs.length-1;
return LCP(strs,left,right);
}
private String LCP(String[] strs, int left,int right){
if(left==right)return strs[left];
String leftString=LCP(strs,left,(left+right)/2);
String rightString=LCP(strs,(left+right)/2+1,right);
return commonString(leftString, rightString);
}
private String commonString(String l,String r){
int min=Math.min(l.length(),r.length());
for(int i=0;i<min;i++){
if(l.charAt(i)!=r.charAt(i)){
return l.substring(0,i);
}
}
return l.substring(0,min);
}
}
Solution 4:DIVIDE&CONQUER 2
对strs[0]进行分支和递归
其实整体思路和solution1是一样的
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0||strs==null) return "";
for(int i=0;i<strs.length;i++){
if(strs[i].length()==0) return "";
}
//prefix初始化为空
String prefix="";
return LCP(strs,0,strs[0].length()-1,prefix);
}
private String LCP(String[] strs,int l,int r,String prefix){
if(l==r)return Check(strs,l,prefix);
int mid=(l+r)/2;
//如果prefix没有更新,说明左半部分(l, mid)没有匹配上
//右半部分(mid+1, r)不用再判难了,就直接返回
if(prefix==LCP(strs,l,mid,prefix)) return prefix;
//如果predix更新了,此时将新的predix传入右半部分的LCP函数
return LCP(strs,mid+1,r,LCP(strs,l,mid,prefix));
}
private String Check(String[] strs,int k,String prefix){
for(int i=1;i<strs.length;i++){
if(k>=strs[i].length()||strs[i].charAt(k)!=strs[0].charAt(k))
return prefix; //直接返回老的prefix
}
return prefix+strs[0].charAt(k);//如果匹配上了,则添上新的字符使prefix更新
}
}
Solution 5:二分搜索法
注意low要<=high,不能只小于,因为一开始可能low high就是同一个数(长度为1)
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0)
return "";
int minLen = Integer.MAX_VALUE;
for (String str : strs)
minLen = Math.min(minLen, str.length());
int low = 1;
int high = minLen;
while (low <= high) {
int middle = (low + high) / 2;
if (isCommonPrefix(strs, middle))
low = middle + 1;
else
high = middle - 1;
}
return strs[0].substring(0, (low + high) / 2);
}
private boolean isCommonPrefix(String[] strs, int len){
String str1 = strs[0].substring(0,len);
for (int i = 1; i < strs.length; i++)
if (strs[i].indexOf(str1)!=0) // if (!strs[i].startsWith(str1))也可以
return false;
return true;
}
}