題目要求:
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""
。
示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
說明:
所有輸入只包含小寫字母 a-z
。
C++代碼:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty())
return "";
string prefix = strs[0];
for(int i = 1 ; i < strs.size() ; i++){
int k = 0;
while(k < prefix.size() && k < strs[i].size() && prefix[k] == strs[i][k])
k++;
if(k != prefix.size())
prefix = prefix.substr(0,k);
if(prefix.empty())
return "";
}
return prefix;
}
};
結果(4ms):
解析:
首先,判斷strs是否爲空,如果爲空,那麼最長公共前綴肯定就是空;
if (strs.empty()) {
return "";
}
然後我們首先取第一個元素strs[0]作爲初始的最長公共前綴,因爲還沒開始對比判斷時,第一個元素strs[0]自己本身肯定就是最長公共前綴;
string prefix = strs[0];
然後從i=1,也就是第二個元素開始,到 strs.size() 最後一個元素,進行循環;
for (int i = 1; i < strs.size(); i++) {
}
通過定義一個k來計數,記錄strs數組裏面兩個元素對比後,最後取到的最長公共前綴的長度
int k = 0;
然後通過一個while循環進行判斷,只要k小於prefix(當前最長公共前綴)的長度prefix.size(),且k小於 strs[i].size()也就是當前進行判斷的元素的長度,且 prefix[k] == strs[i][k] ,也就是當前最長公共前綴的每一位都跟當前進行判斷的元素的每一位的字符串都一致時,那麼我們就k++,計數+1,直到不滿足條件,記錄下當前的最長公共前綴的長度k
while (k < prefix.size() && k < strs[i].size() && prefix[k] == strs[i][k]) {
k++;
}
然後進行判斷,就是當前的k跟上一次的prefix的長度prefix.size()不一樣時,那麼就更新一下,取prefix.substr(0, k),也就是prefix從下標爲0,到最長長度k下標這麼長的字符串作爲當前最長公共前綴
if (k != prefix.size()) {
prefix = prefix.substr(0, k);
}
如果最後遍歷完所有元素,最長公共前綴爲空的話,那麼就返回空“”
if (prefix.empty()) {
return "";
}
最後for循環結束後,return prefix即可。