題目地址:https://leetcode-cn.com/problems/longest-common-prefix/
題目描述
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""
。
題目示例
示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
解題思路
思路1:我們對字符串數組strs,依次遍歷其中的每個字符串(單詞),對於每個遍歷到的字符串,更新最長公共前綴,當遍歷完所有的字符串以后,即可得到字符串數組中的最長公共前綴prefix。時間復雜度O(mn),其中m為字符串數組中的字符串的平均長度,n為字符串數組的長度,空間復雜度O(1)。
思路2:國際站一位老哥代碼,個人感覺非常容易理解。思路主要是先對字符串數組進行排序,然后選擇排好序之后的字符串數組中的第一個和最后一個字符串,最后比較兩個字符串從下標0開始有多少個公共字符。
程序源碼
思路1
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()) return ""; //字符串數組沒有字符串 string prefix = strs[0]; for(int i = 1; i < strs.size(); i++) { prefix = longestCommonPrefix(prefix, strs[i]); if(prefix.empty()) { break; } } return prefix; } string longestCommonPrefix(string& s1, string& s2) { int word_len = min(s1.size(), s2.size()); int index = 0; while(index < word_len && s1[index] == s2[index]) { index++; } return s1.substr(0, index); } };
精簡代碼
class Solution { public: string longestCommonPrefix(vector<string>& strs) { string prefix = strs.size()? strs[0] : ""; for(auto str : strs) { while(str.substr(0, prefix.size()) != prefix) { prefix = prefix.substr(0, prefix.size() - 1); if(prefix == "") return prefix; } } return prefix; } };
思路2
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(!strs.size()) return ""; string prefix = ""; sort(begin(strs), end(strs)); string sa = strs[0]; string sb = strs[strs.size() - 1]; for(int i = 0; i < sa.size(); ++i) { if(sa[i] == sb[i]) { prefix += sa[i]; } else break; } return prefix; } };