力扣14.最长公共前缀详解(完整代码带调用测试)

力扣14.最长公共前缀:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。

力扣14最长公共前缀是一道简单题,但是我看通过率仅仅才40%多,所以还是有一定的难度的,在我自行编写的过程中也遇到了很多问题,最终的测试案例有好多通过不过去,所以各种情况想的还不是很全面。官方题解都能查到,所以我只讲解我的代码逻辑,代码测试在文章最后,最终的效果如下:
在这里插入图片描述
思路:首先看到这么多的字符串放在一起,想到的就是用vector容器来进行存放。很容易想到如果想找到公共前缀,我们可以把每个字符串的第一个到最后一个字符进行一一比对,如果一样就计入当前字符,如果不一样就可以把这个字符内容设置成’\0’,然后退出循环,最后进行返回就可以了。
我们可以把这个容器想成一个二维数组,我们进行的每一次比较其实就是按列进行比较(如下所示)
flower
flow
flight
我是用了一个字符串保存最后我要返回的字符串result,刚开始把它的大小设置为第一个字符串的大小(这里一定要初始化字符串的大小,要不然找元素【】位置的时候,会出现内存溢出的问题,我就总是遇到这样的问题),这个大小怎么确定?为什么设置第一个字符串的大小?想想看,最终的最长公共前缀最大肯定是所有字符串中最小的那个长度,所以后面的元素无论是大于第一个字符串的长度,还是小于,最后都会退出循环。

大概思路有了,如下就是最终我代码呈现的效果,有的细节我会在注释进行标注

#include 
using namespace std;
#include 
#include 

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;
}

你可能感兴趣的:(leetcode,算法,职场和发展)