编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-common-prefix
效率还可以,甚至有一次提交时间复杂度超过100%。
class Solution
{
public:
string longestCommonPrefix(vector<string>& strs)
{
string ret;
int n = strs.size();
int len = strs[0].length();
for (int i = 0; i < len; i++)
{
if (len <= i)
break;
char p = strs[0].at(i);//在不越界条件下,每次拿出第一个字符串的第i个字符,那么最坏的情况下走n次
int tag = 1;
for (int j = 1; j < n; j++)
{
if (strs[j].length() <= i || strs[j].at(i) != p)
{
tag = 0;
break;
}
}
if (tag) ret+=p;
else break;
}
return ret;
}
};
但是在做题执行代码时候遇到了错误,原来在内层for循环之前是这么写的:
if (len > i) char p = strs[0].at(i);
else break;
int tag = 1;
本意是如果第一个字符串还没到结尾,那我就再把第一个字符串下一个元素取出来与后面所有的进行比对,如果没有就break。但是在内层循环的if语句中遇到了这个报错,猜测是严谨的编译器发现上面分支如果不走,那么就无法定义这个p,那下面就会有未定义变量,因此改成了上面这一版本,编译通过。
Line 16: Char 63: error: use of undeclared identifier 'p'
if (strs[j].length() <= i || strs[j].at(i) != p)
平均执行用时4ms,显然还有更好的方法,虽然以我的水平不用猜都能知道有更好的方法。。。
看看评论区时间100%大佬Java写法
class Solution
{
public String longestCommonPrefix(String[] strs)
{
if (strs.length == 0) return "";
//公共前缀比所有字符串都短,随便选一个先
String s = strs[0];
for (String string : strs)
{
while (!string.startsWith(s))
{
if(s.length() == 0) return "";
//公共前缀不匹配就让它变短!
s = s.substring(0, s.length() - 1);
}
}
return s;
}
}
观看题解,还有二分查找和分治的算法 ,今天先写到这里,写完这两种算法并通过再贴到下面。