编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
一.解题思路
1) 采用反向思维,将第一个字符串作为基准串,然后使用两层循环,第一层扫描str[0][0:m]的每个元素,第二层,判断str[1:n]每个字符串的每个元素与str[0]是否相等,不等就返回退出
2) leetcode评论区有人会先找整个输入中最短的那个字符串,然后再去比较,这样避免了扫描时,由于基准串长,其他串短而导致的越界错误问题。为了简略代码,其实可以不用这样做,只需要判断当前下标是否已经到达某个字串的上限,如果到达 ,立即返回即可。C++中应该是不需要,因为C++字符串的结尾有个’\0‘,遇到’\0‘时判断也会不相等直接返回即可,但是Python中字符串貌似没有'\0',因此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中对变量的类型其实没有明确的定义,可以在参数和返回值时指定