编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
利用集合set()
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
result = ''
i = 0
while True:
try:
#遍历列表中每个单词,读取单词的第i个字母将其放在一个集合内,如果集合长度为1,说明各个单词的第i个字母都是相同的。
sets = set(string[i] for string in strs)
if len(sets) == 1:
result += sets.pop()
i+=1
else:
break
#try-except结构,如果出现error就break。
except Exception as e:break
return result
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ''
elif len(strs) == 1:
return strs[0]
#选定strs第一个元素作为标杆,将剩下的元素与之比较
start_word = strs[0]
n = len(start_word)
for i in range(n):
#对strs中剩下的遍历,挨个与start_word比较
for j in strs[1:]:
#如果相等的话就一直循环比较,如果不相等的话就返回之前的结果,所以只需要考虑不相等的情况
if i>=len(j) or start_word[i] != j[i]:
return start_word[:i]
return ''
拓展:找出字符串中相同的部分。最长公共子序列
思路:找出列表中最短的字符串,以它的长度为上限。因为极端情况也就是公共子序列的长度等于该字符串的长度。
然后进入while loop。第一个while loop 条件是m<n,也就是判断列表中每个字符串的第m个字母是否相等。第二个while loop是判断当给定m时,第q个和第q+1个字符串的第m个字母是否相同,如果相同就令q+=1继续往下判断,如果判断相等且q=len(strs)-1时,说明列表中所有字符串的第m个字母都相等,将其放进列表中,否则的话就退出第二个循环,并更新m+=1。最后返回result。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
elif len(strs) ==1:
return ''.join(strs)
else:
result = []
words_len = []
p = len(strs)
for i in strs:
j = len(i)
words_len.append(j)
n = min(words_len)
m = 0
while m<n:
q = 0
while q<p-1:
if strs[q][m] == strs[q+1][m]:
q+=1
if q == p-1:
result.append(strs[q][m])
else:
break
m+=1
re = ''.join(result)
return re