【LC_Lesson5】---求最长的公共前缀

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

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

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

一.解题思路

  1) 采用反向思维,将第一个字符串作为基准串,然后使用两层循环,第一层扫描str[0][0:m]的每个元素,第二层,判断str[1:n]每个字符串的每个元素与str[0]是否相等,不等就返回退出

  2) leetcode评论区有人会先找整个输入中最短的那个字符串,然后再去比较,这样避免了扫描时,由于基准串长,其他串短而导致的越界错误问题。为了简略代码,其实可以不用这样做,只需要判断当前下标是否已经到达某个字串的上限,如果到达 ,立即返回即可。C++中应该是不需要,因为C++字符串的结尾有个’‘,遇到’‘时判断也会不相等直接返回即可,但是Python中字符串貌似没有'',因此python代码需要加该条件的判断。

二.代码实现

C++实现

 1 string Solution::LongestCommonPrefix(vector<string> &str)
 2 {
 3     if(str.empty()||str[0].empty()) 
 4         return "";
 5     int key_i = 0;
 6     for(key_i=0; key_i<str[0].size(); key_i++){ 
 7         for(int index=1; index<str.size(); index++){
 8             if(str[index][key_i]!= str[0][key_i]){
 9                 goto Exit;    //just to exit the Double loop
10             }
11         }
12     }
13     Exit:
14     return (key_i==0)?"":str[0].substr(0,key_i);
15 }

经验贴士:

  1) 学习到了vector向量的简单使用方法,待扩展

  2) 了解到了一种退出多层循环的方式,一般来说采用goto也是一种不错的方式,但是必须保证goto仅有这个一处应用,goto作为一个强大而又可以胡作非为的用法,还是少用为主

  3) 学到了string的简单用法,包括定义一个空字串可以不用赋值,string的函数也不可以返回NULL,待扩展

  4) 一种寻找公共字符串时所需要考虑的反向思维,正向思维深度比较深,我们直接考虑反向思维的状况。

Python实现

1 class Solution:
2     def longestCommonPrefix(self, strs)->str:
3         if len(strs) == 0 or len(strs[0]) == 0:
4             return ""
5         for i in range(len(strs[0])):
6             for j in range(1,len(strs)):
7                 if i >= len(strs[j]) or strs[0][i] != strs[j][i]:
8                     return strs[0][0:i]
9         return strs[0]

经验贴士:

  1)  python中在定义类的方法时,self代表类的实例,self在定义类的方法时必须有,即使不必传入相应的参数

  2)python中没有指针的概念,因此空字符串的表示直接返回""即可

  3)  range使用的一些大概方法

  4)  python中对变量的类型其实没有明确的定义,可以在参数和返回值时指定

原文地址:https://www.cnblogs.com/szhb-5251/p/11758626.html