LeetCode(14):最長公共前綴


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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM