每日一練(35):最長公共字首

加班猿發表於2022-03-16

title: 每日一練(35):最長公共字首

categories:[劍指offer]

tags:[每日一練]

date: 2022/03/14


每日一練(35):最長公共字首

編寫一個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 ""。

示例 1:

輸入:strs = ["flower","flow","flight"]

輸出:"fl"

示例 2:

輸入:strs = ["dog","racecar","car"]

輸出:""

解釋:輸入不存在公共字首。

提示:

1 <= strs.length <= 200

0 <= strs[i].length <= 200

strs[i] 僅由小寫英文字母組成

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一:逐字元比較

思路分析

先第一個和第二個比,儲存公共字首,再和第三個比,以此類推

string longestCommonPrefix(vector<string>& strs) {
    if (strs.size() == 0) {
        return "";
    }
    string ans = strs[0];//先從strs[0]開始,與後面一個比較
    for (int i = 0; i < strs.size(); i++) {
        string s = ans;//儲存上次的公共字首
        ans = "";
        for (int j = 0; j < strs[i].size(); j++) {
            if (s[j] == strs[i][j]) {
                ans += s[j];
            } else { //遇到不一樣的就退出迴圈
                break;
            }
        }
        if (ans == "") {
            break;
        }
    }
    return ans;
}

方法二:雙指標

演算法流程:

先找出陣列中字典序最小和最大的字串,最長公共字首即為這兩個字串的公共字首

string longestCommonPrefix(vector<string>& strs) {
    if (strs.size() == 0) {
        return "";
    }
    const auto p = minmax_element(strs.begin(), strs.end());
    for (int i = 0; i < p.first->size(); i++) {
        if (p.first->at(i) != p.second->at(i)) {
            return p.first->substr(0, i);
        }
    }
    return *p.first;
}

相關文章