力扣14.最长公共前缀:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
力扣14最长公共前缀是一道简单题,但是我看通过率仅仅才40%多,所以还是有一定的难度的,在我自行编写的过程中也遇到了很多问题,最终的测试案例有好多通过不过去,所以各种情况想的还不是很全面。官方题解都能查到,所以我只讲解我的代码逻辑,代码测试在文章最后,最终的效果如下:

思路:首先看到这么多的字符串放在一起,想到的就是用vector容器来进行存放。很容易想到如果想找到公共前缀,我们可以把每个字符串的第一个到最后一个字符进行一一比对,如果一样就计入当前字符,如果不一样就可以把这个字符内容设置成’\0’,然后退出循环,最后进行返回就可以了。
我们可以把这个容器想成一个二维数组,我们进行的每一次比较其实就是按列进行比较(如下所示)
flower
flow
flight
我是用了一个字符串保存最后我要返回的字符串result,刚开始把它的大小设置为第一个字符串的大小(这里一定要初始化字符串的大小,要不然找元素【】位置的时候,会出现内存溢出的问题,我就总是遇到这样的问题),这个大小怎么确定?为什么设置第一个字符串的大小?想想看,最终的最长公共前缀最大肯定是所有字符串中最小的那个长度,所以后面的元素无论是大于第一个字符串的长度,还是小于,最后都会退出循环。
大概思路有了,如下就是最终我代码呈现的效果,有的细节我会在注释进行标注
#include <iostream>
using namespace std;
#include <vector>
#include <string>
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string result; //定义一个返回的结果字符串
string result1; /*定义一个返回的结果字符串(因为大小已经设置为第一个字符串大小,
如果最长前缀小与第一个字符串的大小,返回的结果后面会有\0\0\0等等占位,最终是不通过的)
例如"apple","app"*/
result.resize(strs[0].size()); //初始化result字符串的大小(必须,要不会报溢出)
for (int j = 0; j < (strs[0].size()); j++) //列循环
{
for (int i = 0; i < strs.size(); i++) //行循环
{
if (i == 0)
{
result[j] = strs[i][j]; //先把第一个字符放到result[j]中,
continue;
}
if (result[j] == strs[i][j])
{
result[j] = strs[i][j]; //下一个字符相等就继续放入result[j]中
continue;
}
else { //不相等的话就赋为'\0' 退出
result[j] = '\0';
break;
}
}
if (result[j] == '\0') //如果发现result[j]== '\0' 就代表已经找到了最长前缀 可以返回了
{
result1 = result.substr(0, j); //substr() 是个string的返回子字符串的方法返回从0开始到j的字符串
return result1;
}
if (result == strs[0]) //这个if是为了防止"aaa","aaa","aaa","aaa" 所有元素都一样的话 返回,
{ //要不然返回为空
return result;
}
}
return "";
}
};
int main()
{
vector<string> strs = { "flower","flow","flight" }; //测试案例 可以自行更改测试
Solution s;
string result = s.longestCommonPrefix(strs);
cout << result << endl;
system("pause");
return 0;
}
&spm=1001.2101.3001.5002&articleId=127786259&d=1&t=3&u=2d3f6caba432488aa96a08227d2195e0)
558

被折叠的 条评论
为什么被折叠?



