题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。
算法
1.选取第一个字符串作为标准
2.第一个字符串的首位 和 第二个字符串的的首位 进行对比,如果首位相同,进入3
3.第一个字符串的首位 和 第三个字符串的的首位 进行对比,如果首位相同,....类似情况,
4.第2,3步把第一个字符串的首位和所有字符串的首位进行对比,对比结束后,进入5
5.第一个字符串的第2位 和 第二个字符串的的第2位 进行对比,如果第2位相同,....类似上面的情况
代码规划
一、定义
len:用strs.size()判断出来总共有几个字符串
i :代表第一个字符串的当前字符的位置,比如flower i=1,代表是l
j: 代表目前对比的是第几个字符串
res:代表返回的结果,初始设为""
二、核心
while(第1个字符串当前字符位置是否小于字符串的长度)
for(第几个字符)
算法代码(10-16行)
三、解释19行代码
//append是string的新增
//substr(i,1)是取strs【0】的第i位开始后的一位
//也就相当于每次循环结束后取一位字符
正确代码
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 int length = strs.size(); 5 int i = 0; 6 bool flag = true; //标记是否满足匹配条件 7 string res = ""; 8 if(length == 0) 9 return ""; 10 while(i < strs[0].length()){ //以第一个字符串作为标准 11 for(int j = 1; j < length; j++){ 12 if(strs[j] == "" || strs[j][i] != strs[0][i]){ 13 flag = false; 14 break; 15 } 16 } 17 if(flag == false) 18 return res; 19 res.append(strs[0].substr(i,1)); 20 i++; 21 } 22 return res; 23 } 24 };
超时代码
算法(10-12行)
1.用第一个字符串作为标准
2.如果第二个字符串中没有不包含第一个字符串的话
3.那就把第一个字符串的最后一位删掉
4.直到删到和第二个字符串相等为止
5.然后到第10行,i+1,开始看现在删改后的第一个字符串是否被包含在第三个字符串中
6.如果不包含的话,那就再删掉现在第一个字符串的最后一位
结果
但是这个在leetcode上的话,是超时的,所以不能通过
思考
如果我先筛选出来最短的字符串,然后再用这个算法怎么样?留给明天去写
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 string s; 5 s = strs[0]; 6 if(strs.size() == 0) 7 return ""; 8 if(strs.size() == 1) 9 return strs[0]; 10 for(int i=0;i<strs.size();i++){ 11 while(strs[i].find(s) != 0) 12 s=s.substr(0,strs.size()-1); 13 14 } 15 return s; 16 } 17 };
原题链接
14. 最长公共前缀
参考链接