思路:lcp(s1, s2, …, sn)=lcp(lcp(s1, s2)…, sn),即s1~sn的最長公共字首可以轉化為s1和s2的最長公共字首,再求與s3的公共字首等
class
solution
for(
int j=
0; j}return strs[0]
.substr(0
, minn);}
}};
時間複雜度:o(s),s是所有字串的字元數量總和。最壞情況有n個相同的字串,就需要從頭到尾遍歷到所有字元
空間複雜度:o(1),需要常數級別的額外空間
思路:將字串對齊,比較每個字串的第乙個字元,如果相同則繼續向後比較
class
solution}}
}return str;}}
;
時間複雜度:o(s),s是所有字串的字元數量總和。假設有n個字串,最小的長度是minlen,則最好情況是nminlen;當所有的字串長度相同均為m時,有最壞情況,會進行nm次比較
空間複雜度:o(1),需要常數級別的額外空間
思路:用遞迴模擬乙個二叉樹的結構,每個字串為最底層的葉子結點,每個父結點代表的是孩子節點的最長公共字首,則最後遞迴回溯求得的根結點的值即為所有字串的最長公共字首
class
solution
else
return str;
} string longestcommonprefix
(vector
& strs,
int left,
int right)
} string commonprefix
(string str1, string str2)
return str1.
substr(0
, i);}
};
時間複雜度:o(s),s是所有字串字元總和。最好最壞情況下的比較次數同上
空間複雜度:o(mlogn),主要是遞迴過程中使用到的棧空間。假設有n個長度為m的相同字串,每次需要m的空間返回字串,比較次數為logn,那麼就需要mlogn的額外空間
思路:先找到最短字串的長度,用兩個指標乙個指向字串開頭,乙個指向最短字串長度的位置,mid指標指向兩指標中間。每次比較開頭到mid位置的字串是不是最長公共字首,如果是的話,則保留前半部分,將low指向mid+1;如果不是的話,說明後半部分一定不滿足最長公共字首,就將high指標指向mid-1
class
solution
str=strs[0]
.substr(0
,(low+high)/2
);}return str;
}bool
ischecked
(vector
& strs,
int mid)
return
true;}
};
時間複雜度:o(slog(n)),s為所有字串字元總和。(1/2)^n=1,則二分的時間複雜度是o(logn),假設有n個長度為m的相同字串,最多的比較次數s=nm,因此總的時間複雜度是o(s*log(n))
空間複雜度:o(1),需要常數級別的額外空間
等我學了字典樹來填坑~
執行結果比較
反思:前兩種解法是普遍的解法,後三種其實寫起來是容易出錯的,為了開闊眼界才實現的。綜合來看,水平掃瞄既是最好想出來的,也是表現相對較好的。
分治用到了遞迴,是一種空間換時間的解法;二分用了迭代,是用時間換空間的解法
還有還有,string庫函式的呼叫真的很耗效能
LeetCode14最長公共字首
編寫乙個函式來查詢字串陣列中最長的公共字首字串。例如 輸出 ab 比較乙個字串陣列的最長公共字首,遍歷整個字串陣列,建立乙個字串用來儲存當前最長公共字串,逐個比較,不斷更新公共字串內容。情況比較多,考慮周全,不然可能會陣列溢位。公共字串的長度和當前比較字串的長度大小的比較,避免陣列越界,還有空字串的...
LeetCode 14 最長公共字首
編寫乙個函式來查詢字串陣列中最長的公共字首字串。用第乙個字串s,比較strs的每個字串的公共字首,並記錄字首有m位,之後輸出s的前m位字元即可。但是在輸出過程中,使用了如下的賦值方式 for int i 0 i m i ans i s i 在string型別中,內部的成員是private的,所以不能...
LeetCode14 最長公共字首
題目描述 編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母a z。如下 class solutio...