【LeetCode-字符串】最長公共前綴


題目描述

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

輸入: ["flower","flow","flight"]
輸出: "fl"

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

題目鏈接: https://leetcode-cn.com/problems/longest-common-prefix/

思路1

首先找到最短的字符串,然后遍歷最短的字符串,將當前位和其余字符串作比較:如果其余字符串的當前位和最短字符串的當前位全部相等,則比較下一位;如果有一個不相等,則循環終止,從字符串開始位置到當前位置的前一位就是最長的公共前綴(其實不需要根據最短字符串進行比較,隨便找一個字符串作為基准比較就行了)。代碼如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";

        int shortest = 0x7fffffff;
        string shortestStr = "";
        for(int i=0; i<strs.size(); i++){
            if(strs[i].length()<shortest){
                shortest = strs[i].length();
                shortestStr = strs[i];
            }
        }

        int i=0;
        while(i<shortest){
            bool breakFlag = false;
            for(int j=0; j<strs.size(); j++){
                if(strs[j][i]!=shortestStr[i]){
                    breakFlag = true;
                    break;
                }
            }
            if(breakFlag) break;
            i++;
        }
        return shortestStr.substr(0,i);
    }
};
  • 時間復雜度:O(n)
    n是字符串數組的長度。最壞情況下為O(n*m),其中m是最短字符串的長度。
  • 空間復雜度:O(1)

思路2

首先選擇一個字符串當做目前的前綴,不妨選第一個,然后判斷目前的前綴是否是第二個字符串的前綴:如果不是,則將當前的前綴最后一個字符去掉,如果去掉后當前前綴為空,則直接返回;如果去掉后不為空且是第二個字符串的前綴;那么繼續通過同樣的方法比較第三個字符串,直至比較一遍或者前綴為空,如果比較結束后,當前前綴不為空,則當前前綴就是最長的公共前綴。代碼如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";

        string prefix = strs[0];
        for(int i=1; i<strs.size(); i++){
            while(strs[i].find(prefix)!=0){    // prefix不是strs[i]的前綴
                prefix.pop_back(); // 刪除prefix的最后一個字符
                if(prefix.empty()) return prefix;
            }
        }
        return prefix;
    }
};
  • 時間復雜度:O(n)
    n為字符串數組的長度。
  • 空間復雜度:O(1)


免責聲明!

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



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