1. 程式人生 > 其它 >雙指標演算法

雙指標演算法

技術標籤:Leetcode每日打卡_每日一道leetcode演算法資料結構

Leetcode 14 最長公共字首

題目描述

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

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

題解1(字串排序)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty())
            return
string(); //利用字串排序 sort(strs.begin(), strs.end()); //隨便挑兩個 string f_str = strs.front(); string e_str = strs.back(); size_t i = 0; while(i < min(f_str.size(), e_str.size())){ if(f_str[i] == e_str[i]) i++; else
break; } return f_str.substr(0,i); } };

提交結果

題解2(橫向比較)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty())
            return string();
        size_t s_str = strs.size();
        string fianls = strs[0];
for(size_t i = 1; i < s_str; i++){ size_t j = 0; while(j < min(fianls.size(), strs[i].size())){ if(fianls[j] == strs[i][j]) j++; else break; } fianls = fianls.substr(0,j); if(! fianls.size()) return string(); } return fianls; } };

提交結果

題解3(縱向比較,注意越界)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty())
            return string();
        size_t s_str = strs.size();
        string finals = "";
        for(size_t i = 0; i < strs[0].size();){
            size_t j = 0;
            while(j < s_str-1){
                if(i == strs[j].size())
                    return finals;
                if(strs[j][i] == strs[j+1][i])
                    j++;
                else break;
            }
            if(j == s_str-1){
                finals += strs[0][i];
                i++;
            }else{
                return finals;
            }
        }
        return finals;
    }
};

提交結果

題解4(大神的排序程式碼)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";
        // c++17 結構化繫結
        // str0, str1 分別是一個 pair<string, string> 的 first 和 second
        const auto [str0, str1] = minmax_element(strs.begin(), strs.end());
        for(int i = 0; i < str0->size(); ++i)
            if(str0->at(i) != str1->at(i)) return str0->substr(0, i);
        return *str0;
    }
};

提交結果