Easy!
題目描述:
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""。
示例 1:
輸入: ["flower","flow","flight"] 輸出: "fl"
示例 2:
輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共前綴。
說明:
所有輸入只包含小寫字母 a-z 。
解題思路:
這道題讓我們求一系列字符串的共同前綴,沒有什么特別的技巧,無腦查找即可,我們定義兩個變量i和j,其中i是遍歷搜索字符串中的字符,j是遍歷字符串集中的每個字符串。這里將單詞上下排好,則相當於一個各行長度有可能不相等的二維數組,我們遍歷順序和一般的橫向逐行遍歷不同,而是采用縱向逐列遍歷,在遍歷的過程中,如果某一行沒有了,說明其為最短的單詞,因為共同前綴的長度不能長於最短單詞,所以此時返回已經找出的共同前綴。我們每次取出第一個字符串的某一個位置的單詞,然后遍歷其他所有字符串的對應位置看是否相等,如果有不滿足的直接返回res,如果都相同,則將當前字符存入結果,繼續檢查下一個位置的字符,參見代碼如下:
C++參考答案一:
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 if (strs.empty()) return ""; 5 string res = ""; 6 for (int j = 0; j < strs[0].size(); ++j) {//j遍歷字符串集中的每個字符串 7 char c = strs[0][j]; 8 for (int i = 1; i < strs.size(); ++i) {//i遍歷搜索字符串中的字符
//每次取出第一個字符串的某一個位置的單詞,然后遍歷其他所有字符串的對應位置看是否相等,如果有不滿足的直接返回res
9 if (j >= strs[i].size() || strs[i][j] != c) { 10 return res; 11 } 12 } 13 res.push_back(c);//如果都相同,則將當前字符存入結果,繼續檢查下一個位置的字符 14 } 15 return res; 16 } 17 };
可以對上面的方法進行適當精簡,如果我們發現當前某個字符和下一行對應位置的字符不相等,說明不會再有更長的共同前綴了,我們直接通過用substr的方法直接取出共同前綴的子字符串。如果遍歷結束前沒有返回結果的話,說明第一個單詞就是公共前綴,返回為結果即可。代碼如下:
C++參考答案二:
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 if (strs.empty()) return ""; 5 for (int j = 0; j < strs[0].size(); ++j) { 6 for (int i = 0; i < strs.size() - 1; ++i) { 7 if (j >= strs[i].size() || j >= strs[i + 1].size() || strs[i][j] != strs[i + 1][j]) { 8 return strs[i].substr(0, j); 9 } 10 } 11 } 12 return strs[0]; 13 } 14 };
