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
,可能是服務器端捕獲了錯誤,然後直接給報錯了。