LeetCode刷題 14 最長公共前綴

題目

編寫一個函數來查找字符串數組中的最長公共前綴。
若是不存在公共前綴,返回空字符串 ""。

示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"python

示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。c++

說明:
全部輸入只包含小寫字母 a-z 。數組

思考

看見這個題目,我能想到的最簡單最好理解的,就是先把全部的可能的公共前綴找出來,而後去一個一個比較。這個全部的公共前綴其實很簡單,第一個字符串的的前1個字符,前2個字符,以此類推直到最後。這裏只須要簡單的雙循環就能解決問題。app

看了官解的解法,我本身的這個解法有點相似官解的水平掃描法,從左到右掃描。函數

解題思路

  1. 把第一個字符串取出來,而後按照前1個字符,前2個字符,前3個字符,以此類推遍歷一遍字符串,例如"flower"->["f","fl","flo","flow","flowe","flower"]
  2. 而後就是簡單的把上面獲得的字符串,跟獲得的須要比較的字符串所有遍歷一遍
  3. 若是找到了,那個字符串就是答案,沒找到就返回空字符串

Python實現

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if 0 == len(strs):
            return ""
        
        #分解第一個字符串
        checkStrList = list()
        for i in range(len(strs[0])):
            checkStrList.append(strs[0][0:(i + 1)])
        #排除比較第一個字符串    
        targetStrs = strs[1:]
        
        resStr = ""
        for checkStr in checkStrList:
            bForceEnd = False
            
            for targetStr in targetStrs:
                if not targetStr.startswith(checkStr):
                    bForceEnd = True
                    break
                    
            if bForceEnd:
                break
                
            resStr = checkStr
        
        return resStr

執行用時 :48 ms, 在全部 Python3 提交中擊敗了85.61%的用戶,內存消耗 :14 MB, 在全部 Python3 提交中擊敗了5.53%的用戶code

C++實現

class Solution 
{
public:
    string longestCommonPrefix(vector<string>& strs) 
    {
        if(0 == strs.size())    return "";
        
        //分解第一個字符串
        vector<string> checkStrs;
        for(auto i = 0; strs[0][i] != '\0'; ++i)
        {
            checkStrs.push_back(strs[0].substr(0, i + 1));
        }
        
        string resStr = "";
        for(auto i = 0; i < checkStrs.size(); ++i)
        {
            bool bForceEnd = false;
            for(auto j = 1; j < strs.size(); ++j)//排除比較第一個字符串  
            {
                std::size_t found = strs[j].find(checkStrs[i]);
                if(found == std::string::npos || found != 0)
                {
                    bForceEnd = true;
                    break;
                }
            }
            if(bForceEnd)
            {
                break;
            }
            resStr = checkStrs[i];
        }
        
        return resStr;
    }
};

執行用時 :8 ms, 在全部 C++ 提交中擊敗了75.71%的用戶,內存消耗 :9.1 MB, 在全部 C++ 提交中擊敗了72.94%的用戶內存

相關文章
相關標籤/搜索