編寫一個函數來查找字符串數組中的最長公共前綴。
若是不存在公共前綴,返回空字符串 ""。示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"python示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。c++說明:
全部輸入只包含小寫字母 a-z 。數組
看見這個題目,我能想到的最簡單最好理解的,就是先把全部的可能的公共前綴找出來,而後去一個一個比較。這個全部的公共前綴其實很簡單,第一個字符串的的前1個字符,前2個字符,以此類推直到最後。這裏只須要簡單的雙循環就能解決問題。app
看了官解的解法,我本身的這個解法有點相似官解的水平掃描法,從左到右掃描。函數
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
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%的用戶內存