自己写的
==思路很简单,首先设置好i,j,其中i是用来表示列表中字符串的序号,j使用来表示字符串中的序号,如果两两字符串相等,那么j+1接着比较下一个字符,如果两两字符不相等,则输出当前的前缀字符串。
==Time complexity : O(S) , where S is the sum of all characters in all strings.,空间复杂度O(1),时间复杂度我想应该是这样的,因为字符串的个数是常数级的,字符串的长度也是常数级的,因此时间复杂度也是常数级的。
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 0:
return ''
if len(strs) ==1:
return strs[0]
str = ''
i, j = 0, 0
while i + 1 < len(strs) and j < len(strs[i]) and j < len(strs[i+1]):
if strs[i][j] == strs[i + 1][j]:
i += 1
if i == len(strs) - 1:
str += strs[0][j]
i = 0
j += 1
else:
return str
return str
Horizontal scanning
==这个是Leetcode Solution里的第一个方法,我把它从Java改成python,思路刚好是倒着来的,直接把第一个字符串作为前缀,如果第二个字符串可以查询不到第一个字符串,那么去除前缀的最后一个字符再比较,直到不满足while循环,也就是查询到了,而且是返回的序号是0,那么再比较下一个字符串,依次这样。
==Time complexity : O(S) , where S is the sum of all characters in all strings.
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 0:
return ''
prefix = strs[0]
for i in range(1, len(strs)):
while strs[i].find(prefix) !=0:
prefix = prefix[:-1]
if not prefix:
return ''
return prefix
==有一个问题,java里面的indexof返回的是字符串中查询到前缀的第一个字符的序号,也就是0.在python里面使用的是find返回字符串查询到的前缀的第一个字符的序号,即0,如果查询不到则返回-1,如果查询到的前缀不在最前面,返回相应的序号。
#查询到了,但不是最前面
'acc'.find('c')
Out[26]: 1
#查询不到
'compare'.find('come')
Out[30]: -1
#查询到了,是在最前面,这也是我们需要的结果
'compare'.find('com')
Out[31]: 0