LeetCode 14.最长公共前缀
Requirement
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
解题思路1
运用分治法,将数组中的多个字符串分为左右两个子字符串,分别求出左右两侧的最长公共前缀,再进行比对,求出其共同部分,即为原问题的解.
代码
class Solution {
public:
//使用分治法
string commonPrefix(string LCPleft, string LCPright) //判断公共前缀
{
string ans = "";
int lsize = LCPleft.size();
int rsize = LCPright.size();
int minsize = lsize < rsize ? lsize : rsize; //公共前缀最长只能有LCPleft/LCPright中较短一个串的长度
//故通过比较来限制循环次数
for(int i = 0; i < minsize; i++)
{
if(LCPleft[i] == LCPright[i])
{
ans = ans + LCPleft[i]; //相同则在ans后加上当前字符
}
else return ans; //不相同则当前ans即是公共前缀,跳出循环直接返回
}
return ans; //每个字符都相等,循环结束,也返回当前ans
}
string LCP(int low, int high, vector<string>& strs)
{
if(low == high)
{
return strs[low];
}
int mid = (low+high)/2;
string LCPleft = LCP(low, mid, strs); //左边一组的最长公共前缀
string LCPright = LCP(mid + 1, high, strs); //右边一组的最长公共前缀
return commonPrefix(LCPleft, LCPright); //对两个子问题的结果再求最长公共前缀即为整个问题的最长公共前缀
}
string longestCommonPrefix(vector<string>& strs)
{
int length = strs.size() - 1;
if(strs.size() == 0)
return "";
return LCP(0,length,strs);
}
};
Assessment
Remark
为什么执行用时会这么长呢?分治法不是挺高效的吗?
还是我哪里写的有问题呢?
评论区好像很少有用分治法的…
路漫漫其修远兮,吾将上下而求索…