乐趣区

关于leetcode:每日一练35最长公共前缀


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;
}
退出移动版