?LeetCode刷題實(shí)戰(zhàn)14: 最長公共前綴
算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !
今天和大家聊的問題叫做最長公共前綴?,我們先來看題面:
https://leetcode-cn.com/problems/longest-common-prefix/
Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "".
題意
""。樣例
示例?1:
輸入: ["flower","flow","flight"]
輸出: "fl"
示例?2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
題解
解法一
首先找出長度最短的字符串str,加入str="abcf"。
依次對(duì)'abcf'、'abc'、'ab'、'a'進(jìn)行篩選,判斷哪個(gè)是所有其他字符串的前綴。
public?String longestCommontPrefix6(String[] strs)?{
????if(strs.length == 0) {
????????return?"";
????}
????int?min = Integer.MAX_VALUE;
????for(String str : strs) {
????????min = Math.min(min, str.length());
????}
????int?low = 1;
????int?high = min;
????while(low <= high) {
????????int?middle = (low + high)/2;
????????if(this.isCommontPrefix(strs, middle)) {
????????????low = middle + 1;
????????} else?{
????????????high = middle - 1;
????????}
????}
????return?strs[0].substring(0, (low + high)/2);
}
public?boolean?isCommontPrefix(String[] strs, int?length)?{
????String tmp = strs[0].substring(0, length);
????for?(int?i=0; i????????if(!strs[i].startsWith(tmp)) {
????????????return?false;
????????}
????}
????return?true;
}
解法二

public?String?longestCommonPrefix3(String[] strs) {
????if(strs.length == 0) {
????????return?"";
????}
????String?result = strs[0];
????for(int i=0; i????????while(strs[i].indexOf(result) != 0) {
????????????result = result.substring(0, result.length()-1);
????????????if(result.length() == 0) {
????????????????return?"";
????????????}
????????}
????}
????return?result;
}
解法三
找出最短的字符串記為m;
對(duì)字符串m進(jìn)行二分,分割點(diǎn)記為mid,用tmp表示m[low...high]。
如果tmp為所有字符串的前綴,則mid右移,否則左移,直到low>high。
代碼如下:
public?String longestCommontPrefix6(String[] strs)?{
????if(strs.length == 0) {
????????return?"";
????}
????int?min = Integer.MAX_VALUE;
????for(String str : strs) {
????????min = Math.min(min, str.length());
????}
????int?low = 1;
????int?high = min;
????while(low <= high) {
????????int?middle = (low + high)/2;
????????if(this.isCommontPrefix(strs, middle)) {
????????????low = middle + 1;
????????} else?{
????????????high = middle - 1;
????????}
????}
????return?strs[0].substring(0, (low + high)/2);
}
public?boolean?isCommontPrefix(String[] strs, int?length)?{
????String tmp = strs[0].substring(0, length);
????for?(int?i=0; i????????if(!strs[i].startsWith(tmp)) {
????????????return?false;
????????}
????}
????return?true;
}
今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。
上期推文:
LeetCode刷題實(shí)戰(zhàn)1:在數(shù)組上遍歷出花樣
LeetCode刷題實(shí)戰(zhàn)2:用鏈表模擬加法
LeetCode刷題實(shí)戰(zhàn)3:最長不重復(fù)子串
LeetCode刷題實(shí)戰(zhàn)4:兩個(gè)正序數(shù)組的中位數(shù)
LeetCode刷題實(shí)戰(zhàn)5:判斷回文子串
LeetCode刷題實(shí)戰(zhàn)6:Z字形變換
LeetCode刷題實(shí)戰(zhàn)7:整數(shù)反轉(zhuǎn)
LeetCode刷題實(shí)戰(zhàn)8:字符串轉(zhuǎn)換整數(shù)
LeetCode刷題實(shí)戰(zhàn)9:求解回文數(shù)
LeetCode刷題實(shí)戰(zhàn)10:字符串正則匹配
LeetCode刷題實(shí)戰(zhàn)11: 盛最多水的容器
LeetCode刷題實(shí)戰(zhàn)12: 整數(shù)轉(zhuǎn)羅馬數(shù)字
LeetCode刷題實(shí)戰(zhàn)13: 羅馬數(shù)字轉(zhuǎn)整數(shù)
