@Leetcode最长公共前缀
看到最长公共前缀,相信大多数的小白coder肯定和我一样,联想到最长公共子序列算法。但是那个算法和今天的最长公共前缀有很大的区别,究竟区别在哪呢,让我们先看题干:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
说明:所有输入只包含小写字母 a-z 。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: " "
解释: 输入不存在公共前缀。
从题干中我们可以和明显的看出一个特点,有公共前缀的字符串数组,必然可以选择一个作为参照,来给其他的字符串数组进行比较,这个比较一旦出现不同,就可以直接返回“ ”,那么我们为什么不找一个最短的作为比较的参照呢?
那么细节的地方也有不少,比如说当所给的字符串数组集为空时也要输出“ ”,当所给的字符串数组集只有下标0时,就只输出那个数组等等。
代码如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ret="";
int flag=0,tag=0,t=0;
if(strs.size()==0)
return ret;
else if(strs.size()==1)
return strs[0];
int mini=strs[0].size();
for(int i=1;i<strs.size();i++)
if(strs[i].size()<mini)
mini=strs[i].size();
while(1)
{
for(int j=1;j<strs.size();j++)
{
if(t==mini)
{
tag=1;
break;
}
if(strs[j][t]==strs[flag][t])
{
if(j==strs.size()-1)
{
ret+=strs[0][t];
t++;
}
else
continue;
}
else
{
tag=1;
break;
}
}
if(tag==1)
return ret;
}
}
};
这段代码写的比较啰嗦,但具体思路还是比较明晰的。首先指出一个不必要的变量定义,就是那个flag,本来是想在找出最短的那个字符串数组之后以那个为标准进行比较的,但后来发现代码更加复杂了,逻辑更加难懂,就放弃了,也没有改。
本题思路是将每个字符串数组都和最短的那个进行逐个比较,一旦达到最短的长度,或者出现不同,就返回当前ret存储的值,在满足条件时就加上并继续执行t++操作,意思是判断下一个字符,而j++才是判断下一个字符串。
本题的注意事项是要边界问题和字符串数组的定义问题,还有strs[j].size()与strs.size()的区别。虽不是什么难题,但小小细节也可能让你很久不得通过,必须注意呀。