題目描述
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""。
示例
輸入: ["flower","flow","flight"]
輸出: "fl"
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
題目鏈接: https://leetcode-cn.com/problems/longest-common-prefix/
思路1
首先找到最短的字符串,然后遍歷最短的字符串,將當前位和其余字符串作比較:如果其余字符串的當前位和最短字符串的當前位全部相等,則比較下一位;如果有一個不相等,則循環終止,從字符串開始位置到當前位置的前一位就是最長的公共前綴(其實不需要根據最短字符串進行比較,隨便找一個字符串作為基准比較就行了)。代碼如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
int shortest = 0x7fffffff;
string shortestStr = "";
for(int i=0; i<strs.size(); i++){
if(strs[i].length()<shortest){
shortest = strs[i].length();
shortestStr = strs[i];
}
}
int i=0;
while(i<shortest){
bool breakFlag = false;
for(int j=0; j<strs.size(); j++){
if(strs[j][i]!=shortestStr[i]){
breakFlag = true;
break;
}
}
if(breakFlag) break;
i++;
}
return shortestStr.substr(0,i);
}
};
- 時間復雜度:O(n)
n是字符串數組的長度。最壞情況下為O(n*m),其中m是最短字符串的長度。 - 空間復雜度:O(1)
思路2
首先選擇一個字符串當做目前的前綴,不妨選第一個,然后判斷目前的前綴是否是第二個字符串的前綴:如果不是,則將當前的前綴最后一個字符去掉,如果去掉后當前前綴為空,則直接返回;如果去掉后不為空且是第二個字符串的前綴;那么繼續通過同樣的方法比較第三個字符串,直至比較一遍或者前綴為空,如果比較結束后,當前前綴不為空,則當前前綴就是最長的公共前綴。代碼如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
string prefix = strs[0];
for(int i=1; i<strs.size(); i++){
while(strs[i].find(prefix)!=0){ // prefix不是strs[i]的前綴
prefix.pop_back(); // 刪除prefix的最后一個字符
if(prefix.empty()) return prefix;
}
}
return prefix;
}
};
- 時間復雜度:O(n)
n為字符串數組的長度。 - 空間復雜度:O(1)