题目:14. 最长公共前缀
简单
相关标签
相关企业
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
思路:纵向扫描
纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。
语法知识:
-
substr
substr是C++中的一个字符串函数,用于获取字符串的子串。它的第一个参数是子串的起始位置,第二个参数是子串的长度。在这里,我们将起始位置设为0,长度设为当前位置i,即获取从字符串开头到当前位置的子串。
例如,如果最长公共前缀是"fl",而当前位置i=2,则strs[0].substr(0, i)将返回"fl" -
strs[0].size()和strs.size()的区别:
strs[0].size()是第一个字符串的长度
strs.size()是所有字符串的个数
代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(!strs.size())
return "";
int len = strs[0].size();
int length = strs.size();
for(int i=0;i<len;i++)
{
char a = strs[0][i];
for(int j=1;j<length;j++)
{
if(strs[j][i]!=a||i==strs[j].size())
return strs[0].substr(0,i);
}
}
return strs[0];
}
};
运行的过程:
当输入的字符串数组strs
为["flower", "flow", "flight"]
时,我们来逐步执行这段代码的过程。
首先,判断strs
是否为空,由于strs
不为空,我们继续执行。
然后,获取第一个字符串的长度,即length = strs[0].size()
,此时length
的值为6
。
接着,获取字符串数组的长度,即count = strs.size()
,此时count
的值为3
。
接下来,我们开始外层循环,从第一个字符开始逐个比较每个字符串的字符。
-
第一次循环,
i = 0
,取出第一个字符串的第一个字符c = 'f'
。然后,我们进入内层循环,遍历剩余的字符串。-
对于第二个字符串
"flow"
,在当前位置i = 0
,字符'f'
与第一个字符串的字符相等,继续下一个字符串。 -
对于第三个字符串
"flight"
,在当前位置i = 0
,字符'f'
与第一个字符串的字符相等,继续下一个字符串。
-
-
第二次循环,
i = 1
,取出第一个字符串的第二个字符c = 'l'
。然后,我们进入内层循环,遍历剩余的字符串。-
对于第二个字符串
"flow"
,在当前位置i = 1
,字符'l'
与第一个字符串的字符相等,继续下一个字符串。 -
对于第三个字符串
"flight"
,在当前位置i = 1
,字符'l'
与第一个字符串的字符相等,继续下一个字符串。
-
-
第三次循环,
i = 2
,取出第一个字符串的第三个字符c = 'o'
。然后,我们进入内层循环,遍历剩余的字符串。-
对于第二个字符串
"flow"
,在当前位置i = 2
,字符'o'
与第一个字符串的字符相等,继续下一个字符串。 -
对于第三个字符串
"flight"
,在当前位置i = 2
,字符'o'
与第一个字符串的字符不相等,返回。 -
对于第三个字符串
"flight"
,在当前位置i = 2
,字符'i'
与第一个字符串的字符不相等,此时最长公共前缀已经结束,返回第一个字符串的子串,从开头到当前位置,即"fl"
。
-
因此,最终的最长公共前缀为"fl"
。