编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
import collections
from re import findall
from typing import re, List
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
# 内置函数 zip()
res = ''
for i in zip(*strs):
if len(set(i)) == 1:
res += i[0]
else:
break
return res
# 双层for循环
a = []
for i in range(len(strs[0])):
h = True
# 判断第二个元素往后的每个元素开头是不是i,是i,则继续并把元素添加到新列表中,不是i就返回
for j in range(1, len(strs)):
try:
if strs[j][i] == strs[0][i]:
continue
else:
h = False
break
except:
h = False
break
if h == False:
break
a.append(strs[0][i])
m = ''.join(a)
return m
class TestSolution:
def test_three(self):
b = Solution()
b.longestCommonPrefix(["ab", "a"])
# def test_one(self):
# b = Solution()
# b.countAndSay(n=3322251)
#
# def test_two(self):
# b = Solution()
# b.countAndSay(n=4)
从前到后,希望返回数组中所有字符串的 最长的公共前缀。
(1)循环第一个字符串,依次将元素与后面对应位置上的元素做比较,如果相等,则新增到外面的字符串中,如果不相等则停止循环,最终把外面的那个字符串返回即可。
难点在于:如何将数组中的其他字符串对应位置跟第一个字符串做比较。思路是从数组的第二个元素开始,依次遍历每个元素。
实施思路:遍历第一个字符串的每一个元素,当取第一个位置也就是i等于0的时候,接下来遍历数组中后面所有字符串的第一个元素,如果相等则continue,不等则break,并且跳出第一个循环(这里使用的是标记 if h == False 跳出循环)
(2)第二种思路:因为要比对数组中的对应位置的元素。内置函数 zip
就是用来处理对应位置的元素。
(3)zip
同时遍历多个序列,同时遍历多个序列,同时遍历多个序列