今天是第二题,也是一道简单题,直接遍历。
【题目描述】
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
【样例】
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
原题链接:https://leetcode-cn.com/problems/longest-common-prefix
【思路】
题目要求一个字符串数组中所有字符串的最长公共前缀。通过示例和简单的分析,可以知道,当数组的长度为0,答案一定是空字符串;而当数组长度为1的时候,答案就是那个唯一的字符串,因此可以先列出这两种特殊情况。
而后,对于一般情况,可以先选取数组的第一个字符串做为比较的基础。将它和后面的所有字符串,在每个字符上挨个比较。
基于这样的思路,我写了代码,但是发现结果不对劲,找了半天,终于发现,应该先遍历每个字符,在进行每个字符的比较时,遍历数组中的每个字符串。如果发现要比较的那个字符串长度不足或者字符不一致,则可以直接返回结果。如果字符一致,则可以暂存在temp中,遍历完数组中的所有字符串后,添加到答案的尾部。
下面是运行结果:
【代码】
最后附上自己的代码,由于第一次遍历顺序写反了,后面也没有修改,导致j在外层,i在内层。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0){ //当数组的长度为0,答案一定是空字符串
return "";
}
else if(strs.size()==1){//当数组长度为1的时候,答案就是那个唯一的字符串
return strs[0];
}
string ans="";//初始化为空字符串
string str=strs[0]; //选取第一个做为基准
for(int j=0;j<str.length();j++){ //对str的每个字符
string temp="";
for(int i=1;i<strs.size();i++){ //与后面的每个字符串进行比较
if(strs[i].length()<j)//待比较的字符串长度不够,可以认为已找到ans
{
return ans;
}
else if(strs[i][j]!=str[j])//相应位置的字符不一致
{
return ans;
}
else {//相应位置的字符一致
{
temp=str[j];
continue;
}
}
}
ans+=temp;
}
return ans;
}
};