編寫乙個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串""
。
示例 1:
輸入:["flower","flow","flight"]輸出:"fl"示例 2:
輸入:["dog","racecar","car"]輸出:""解釋:輸入不存在公共字首。說明:
所有輸入只包含小寫字母a-z
。
方法一、
class solution
l++;
}res=res.substring(0,l>res.length()?res.length():l);
}return res;
}}
方法二、
水平掃瞄法
時間複雜度:o(s),s是所有字串中字元數量的總和。
最壞的情況下,n個字串都是相同的。演算法會將s1與其它字串[s2....sn]都做一次比較。這樣就會進行s次字元比較,其中s是輸入資料中所有的字元數量。
空間複雜度:o(1),我們只需要使用常數級別的額外空間。
class solution
return prefix;
}}
方法三、
分治思路
這個演算法的思路來自於lcp操作的結合律。 我們可以發現: lcp(s1…sn)=lcp(lcp(s1…sk),lcp(sk+1…sn))lcp(s_1 \ldots s_n) = lcp(lcp(s_1 \ldots s_k), lcp (s_ \ldots s_n))lcp(s1…sn)=lcp(lcp(s1…sk),lcp(sk+1…sn)) ,其中 lcp(s1…sn)lcp(s_1 \ldots s_n)lcp(s1…sn) 是字串 [s1…sn][s_1 \ldots s_n][s1…sn] 的最長公共字首,1演算法
為了應用上述的結論,我們使用分治的技巧,將原問題 lcp(si⋯sj)lcp(s_i\cdots s_j)lcp(si⋯sj) 分成兩個子問題 lcp(si⋯smid)lcp(s_i\cdots s_)lcp(si⋯smid) 與 lcp(smid+1,sj)lcp(s_, s_j)lcp(smid+1,sj) ,其中mid
=i+j2\frac2i+j。 我們用子問題的解lcpleft
與lcpright
構造原問題的解 lcp(si⋯sj)lcp(s_i \cdots s_j)lcp(si⋯sj)。 從頭到尾挨個比較lcpleft
與lcpright
中的字元,直到不能再匹配為止。 計算所得的lcpleft
與lcpright
最長公共字首就是原問題的解 lcp(si⋯sj)lcp(s_i\cdots s_j)lcp(si⋯sj)
複雜度分析:
最壞的情況下,我們有n個長度為m的相同字串。
時間複雜度:o(s),s是所有字串中字元數量的總和 s=m*n.
時間複雜度的遞推式為t(n)=2*t(n/2)+o(m),化簡後可知是o(s).最好情況下,演算法會進行minlen*n次比較其中minlen是陣列中最短字串的長度。
空間複雜度:o(m*log(n)).記憶體開支主要是遞迴過程中使用的棧空間所消耗的。一共會進行log(n)次遞迴,每次需要m的空間儲存返回結果,所以空間複雜度為o(m*log(n))
class solution
private string getlongestcommonprefix(stringstrs,int l,int r)
int mid=l+(r-l)/2;
//[0,mid] [mid+1,r]
string left=getlongestcommonprefix(strs,l,mid);
string right=getlongestcommonprefix(strs,mid+1,r);
return commonprefix(left,right);
}private string commonprefix(string left,string right)
}return left.substring(0,min);
}}
力扣網練習題 最長公共字首
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母 a z param strs return va...
騰訊精選練習題30 整數反轉
給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120 輸出 21注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉後整數...
騰訊精選練習題9 反轉鍊錶
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?方法一 通過記錄前乙個節點的值並通過指標不斷移動的方式 時間複雜度為o n 假設n是列表的長度,時間複雜度是o n 空間複雜度為o 1 defin...