Leetcode 14. 最长公共前缀
一、题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
二、我的想法
1.以数组中第一个字符串为firstStr为标准。
2.遍历数组,并且也遍历第一个字符串的字符。如果其他字符串以firstStr[0:j]为开头,就将firstStr[0:j]赋值给tmpStr,并标记flag为true。如果不是以firstStr[0:j]开头,就将tmpStr减少一位,并标记flag为false,跳出循环。
3.当flag为false时,跳出最外层循环。最后返回的字符串为tmpStr。
python
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
firstStr = strs[0]
firstStrlen = len(firstStr)
tmpStr = ""
flag = False
for j in range(0, firstStrlen + 1):
for i in range(0, len(strs)):
if strs[i].startswith(firstStr[0:j]):
tmpStr = firstStr[0:j]
flag = True
else:
flag = False
tmpStr = tmpStr[:-1]
break
if flag == False:
break
return tmpStr
灵茶山艾府的题解简单多了: 简单题,简单做(Python/Java/C++/C/Go/JS/Rust)
看示例 1:
flower
flow
flight
从左到右,竖着看,第一列全是 f,第二列全是 l,第三列就不全一样了,所以「最长公共前缀」是 fl。
具体算法如下:
1.从左到右遍历 strs 的每一列。
2.设当前遍历到第 j 列,从上到下遍历这一列的字母。
3.设当前遍历到第 i 行,即 strs[i][j]。如果 j 等于 strs[i] 的长度,或者 strs[i][j]不等于strs[i][0],说明这一列的字母缺失或者不全一样,那么最长公共前缀的长度等于 j,返回 strs[0] 的长为 j 的前缀。
4.如果没有中途返回,说明所有字符串都有一个等于 strs[0] 的前缀,那么最长公共前缀就是 strs[0]。
python
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
s0 = strs[0]
for j, c in enumerate(s0):
for s in strs:
if j == len(s) or s[j] != c:
return s0[:j]
return s0