题目
题目来源:https://leetcode-cn.com/problems/longest-common-prefix/
解题思路
自己的思路
首先我们先解读提下题目:什么是最长公共前缀?就是指各个字符串从头开始所具有的相同的最长字符,对于这道题,自己一开始并没有什么很好的思路:主要卡在几个点:
一开始自己的思路是想着通过先比较前两个字符串所具有的最长公共前缀,如果前两个字符没有最长公共前缀,则直接退出,后面的字符串就不用再比较了,这个方法有点类似于暴力解法,自己思路一开始并没有很好的整理清楚,纠结在要用什么方法来不断保存和更新最长公共前缀,暴露出来的问题就是对于string类型的相关知识并没有掌握得很好,所以也就不懂该用什么函数,该用什么方法。
参考思路
参考了一些解答,一种方法就是水平扫描法,也是从第一个字符串开始,遍历完所有得字符串,并且不断更新最长公共前缀。其中有几个巧妙得地方:首先,先设置最长公共前缀为第一个字符串,这样就不用纠结于关于最长公共前缀得保存问题(因为既然说是最长公共前缀,那么第一个字符串也肯定包含有最长公共前缀,这样我们就可以通过不断减少,最终筛出最长公共前缀)。其次用到两个函数是知识盲点:str.find(v)函数和str.substr(n,s)函数,前者是寻找字符串v是否包含在str字符串中,如果不包含,那么返回npos(npos是什么类型呢,标准库将npos定义为一个const string::size_type类型,并初始化为-1),后者是从str字符串中从位置n开始,截取长度为s的字符串,直接上代码:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty())//如果字符串为空,则直接返回
return "";
string str = strs[0];//将最长公共前缀设置为第一个字符串
//再依次比较后面的字符串与目前最长公共前缀,更新最长公共前缀
for (int i = 1; i < strs.size(); i++) {
while (strs[i].find(str)!=0) {//表示最长公共前缀不在字符串的开头位置(或者不含有目前的最长公共字符串)
if (str == "")
return "";
str = str.substr(0, str.length() - 1);
}
}
return str;
}
我们来解读一下该程序:我觉得重点也是难点的地方在于判断。
其一while循环中的find函数为什么以不等于0作为判断条件呢,我们知道,最长公共前缀都是从每个字符串的开头位置开始,那么如果我此时的最长公共前缀在你此时字符串的开头位置开始的,那么说明最长公共前缀就不是这个,就要更新(因为如果字符串中含有最长公共前缀,那么它返回的肯定是位置0)
其二在于如果最长公共前缀减到空,那么直接返回,后面的字符串就不用判断了
总结
自己做这道题真的没什么思路,程序也写不顺,关于string方面的知识还是很欠缺,而且由于这种欠缺,导致自己现在都不敢怎么刷string类型的题目了,所以下一步还是充实string方面的知识。