14. 最长公共前缀
14. 最长公共前缀
代码仓库地址: https://github.com/slience-me/Leetcode
个人博客 :https://slienceme.xyz
-
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
方案1:暴力解 历史最差代码没有之一
第一种纯暴力解,很多不合理的地方,考场上只是为了拿基础分,就是结果导向性解题方式
class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if (strs[0] == ""){return "";}int maxsize = -1;for (const auto &item: strs){maxsize = max(maxsize, static_cast<int>(item.size()));}string res;for (int i = 0; i < maxsize; ++i) {char temp = strs[0][i];string tmp ;for (int j = 0; j < strs.size(); ++j) {if (temp == strs[j][i]){cout<<"temp: "<<temp<<" strs[j][i]: "<<strs[j][i]<<" i: "<<i<<" j: "<<j<<endl;tmp = strs[j][i];} else {tmp = "";goto outerLoop; // 跳到外层循环的标签位置}}res.append(tmp);}outerLoop:return res;}
};
执行用时分布 48ms 击败6.69%使用 C++ 的用户
消耗内存分布9.37MB 击败15.46%使用 C++ 的用户
方案2
初次优化,这种方案比上一种更加合理,去除掉了很多冗余的代码
i >= s.length()关键条件 s[i] != tmp
class Solution {
public:string longestCommonPrefix(vector<string>& strs) {string res;for (int i = 0; i < 200; ++i) {if (i > strs[0].length())return res; //处理空情况char tmp = strs[0][i];for (const auto &s: strs) {if (i >= s.length())return res;// 超出了,则说明当前字符串长度不够 flower flow i=5 >= 4if (s[i] != tmp)return res;}res += tmp;}return res;}
};
执行用时分布 0ms 击败100%使用 C++ 的用户
消耗内存分布 9.04MB 击败63.16%使用 C++ 的用户
方案3
最后的优化,没有太大的提升
class Solution {
public:string longestCommonPrefix(vector<string>& strs) {string ans = "";// 用第一个单词的字符一次遍历全部字符串for (int i = 0; i < strs[0].size(); ++i) {bool flag = true;for (int j = 1; j < strs.size(); ++j) {if (i >= strs[j].size() || strs[j][i] != strs[0][i]) {flag = false; // 合二为一break; // 退出里循环}}if (flag) {ans += strs[0][i];} else {break; // 退出外循环}}return ans;}
};
执行用时分布 4ms 击败%使用 C++ 的用户
消耗内存分布 9.12MB 击败46.03%使用 C++ 的用户