[1日に1つの質問]最も長い共通の接頭辞

https://leetcode-cn.com/problems/longest-common-prefix/

文字列配列で最も長い共通のプレフィックスを見つける関数を記述します。

パブリックプレフィックスがない場合は、空の文字列 ""が返されます。

例1:

入力:[「flower」、「flow」、「flight」]
出力:「fl」
例2:

入力:["dog"、 "racecar"、 "car"]
出力: ""
説明:入力に共通の接頭辞がありません。
説明:

すべての入力には小文字a〜zのみが含まれます。


解決策1

4ms、6.6mbの
ブルートフォース、最初に最短の文字列長を見つけ、次に各文字列の各文字を反復処理し、等しい場合は結果に追加します。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.size() == 0) {
            return "";
        }

        // 找出最短的字符串长度
        int min_len = strs[0].size();
        for (int i = 1; i < strs.size(); ++i) {
            if (strs[i].size() <= min_len) {
                min_len = strs[i].size();
            }
        }

        // 找出公共字符并加到 res 上
        string res = "";
        for (int i = 0; i < min_len; ++i) {
            char c = strs[0][i];
            for (int j = 1; j < strs.size(); ++j) {
                if (c != strs[j][i]) {
                    return res;
                }
            }
            res += c;
        }

        return res;
    }
};

解決策2

暴力は差し引きに他なりません。4ms、6.9mb
最初の文字列が最も長い共通のプレフィックスであると想定して、他の文字列の各文字をトラバースし、別の文字列に遭遇した場合は中断します。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.size() == 0) {
            return "";
        }
        string res = strs[0];
        for (int i = 0; i < strs.size(); ++i) {
            int j = 0;
            for (j = 0; j < res.size() && j < strs[i].size(); ++j) {
                if (res[j] != strs[i][j]) {
                    break;
                }
            }
            res = res.substr(0, j);
            if (res == "") {
                return "";
            }
        }

        return res;
    }
};

EOF

98件のオリジナル記事が公開されました 91件の賞賛 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/Hanoi_ahoj/article/details/105314976