leetcode刷题笔记之最长共同前缀
题目信息
地址:https://oj.leetcode.com/problems/longest-common-prefix/
题目要求
给定一个字符串列表,找出其最长共同前缀,如['ab',
'abc','abcd']
的共同前缀为'ab'
。
我的解答
import unittest
class Solution:
# @return a string
def longestCommonPrefix(self, strs):
if len(strs) == 1:
return strs[0]
from itertools import count
for i in count():
try:
assert eval('=='.join([repr(s[:i+1]) for s in strs]))
except AssertionError, IndexError:
break
return strs[0][:i]
class SolutionTest(unittest.TestCase):
test_map = [
([''], ''),
(['abc'], 'abc'),
(['ab', 'abc','abcd'], 'ab'),
(['', 'abc', 'ab'], ''),
(['a', 'abc', 'abd', 'abe'], 'a'),
]
def make_test(strs, prefix):
def func(self):
s = Solution()
self.assertEquals(prefix, s.longestCommonPrefix(strs))
return func
for i, (j, k) in enumerate(test_map, 1):
locals()['test_case_%d' % i] = make_test(j, k)
if __name__ == '__main__':
unittest.main()
思路解析
- 此处最主要的困难在于判断最短的字符串长度以避免取字串子串时发生下标越界错误,另一个是判断所有字符串的特定长度子串是否相等。
- 第一个问题采用了先试再捕捉错误的思路,避免了先遍历字符串求长度的做法。写起来比较简洁。
- 第二个问题采用了
eval
语句来解决。将所有的子串用==
连接,再用eval
求值,写起来比循环再一个个判断更简洁。 - 虽然本地环境下通过了unittest,但提交代码会报
Compile Error
,可能是服务器端捕获了错误,然后直接给报错了。