Leetcode14._最长公共前缀

题目

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 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. 最长公共前缀

 

参考链接

 

【leetcode】14-最长公共前缀【C++】

14. 最长公共前缀(C++)[简单]

 

转载于:https://www.cnblogs.com/vocoub/p/11576048.html

字符串数组中的最长公共前缀可以通过遍历数组中的字符串进行比较来找到。我们可以设定一个起始的字符串,将其与后续的字符串进行比较,看是否存在公共前缀。如果存在公共前缀,则将起始字符串替换为该公共前缀,再与后续的字符串进行比较,直到遍历结束,最后得到的字符串就是最长公共前缀。\[1\] 以下是一个使用Java语言实现的示例代码: ```java public String longestCommonPrefix(String\[\] strs) { if (strs.length == 0 || strs == null) { return ""; } String ret = strs\[0\]; for (int i = 1; i < strs.length; i++) { if (ret.length() == 0) { return ""; } ret = stringReturn(ret, strs\[i\]); } return ret; } public String stringReturn(String s1, String s2) { int length = Math.min(s1.length(), s2.length()); int i = 0; while (i < length && s1.charAt(i) == s2.charAt(i)) { i++; } return s1.substring(0, i); } ``` 在上述代码中,我们首先判断字符串数组的合法性,然后设定起始字符串为数组的第一个元素。接着通过循环遍历数组中的字符串,将起始字符串与当前字符串进行比较,得到公共前缀。最后返回最长公共前缀。\[2\]\[3\] 请注意,如果字符串数组为空或长度为0,则返回空字符串。如果没有找到公共前缀,则返回空字符串。 #### 引用[.reference_title] - *1* *2* *3* [《LeetCode系列》---最长公共前缀](https://blog.csdn.net/weixin_50584850/article/details/124648635)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值