编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
思路:把字符串中的每一个首字母提取出来,然后依次对比。
第一次写的c++代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int size=strs.size();
vector<char> cur;
string result ="";
if(strs.empty()) return result;
if(size == 1) return strs[0];
int it;
char a;
int length=strs[0].size();
//找到最小的字符长度
for(int i=0;i<strs.size();i++)
{
int temp=strs[i].size();
if(temp<length)
length=temp;
}
for(int i=0;i<length;i++) //第几个字符
{
for(int j=0;j<strs.size();j++) //多少个字符串
{
char tem=strs[j][i];
cur.push_back(tem); //会报错为什么呢?
}
for(it=0;it <cur.size()-1;it++)
{
a= cur[it];
char b= cur[it+1];
if(a != b) break;
}
if(it == cur.size()-1) result.push_back(a);
else return result;
cur.clear();
}
return result;
}
};
很不好看,不是很会用字符串,于是把每个字符串的首字母存到了vector里,又依次读出来俩俩对比。
下面的改进的c++代码:首先读取第一个,然后后面的依次和第一个做对比 不需要另拿出来。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string result ="";
if(strs.empty()) return result;
for(int i=0;i<strs[0].size();i++) //第一个字符串有多少个字符
{
char a0=strs[0][i]; //第一个字符串的第i个字符
for(int j=0;j<strs.size();j++) //第几个字符串
{
if( i>=strs[j].size() || strs[j][i] != a0) return result;
}
result.push_back(a0);
}
return result;
}
};
这个看着舒服多了!注意如何让只读取最小的字符串长度呢
i>=strs[j].size()
注意是这句话,起到了边界的作用。 i是第i个字符,后面是第j个字符串的数量,一旦没有就不用再读取判断了。这个放在 if 的最前面。