首先,先看這個題目的特性,是不是一個要我們窮舉所有可能的窮舉題?題目問的就是窮舉出所有的 Strobogrammatic Number,窮舉的空間非常大,就如同上方的分析,但是又因為是 Strobogrammatic Number 的特性,可以幫助快速的把窮舉的空間進行剪枝,大大的降低時間複雜度,其實我也是沒有信心在面試中是不是可以用窮舉的方法來進行,如同我其他篇文章的建議,禮貌性地問一下面試官,想法對不對,是不是在正確的方向上,好的公司與好的面試官應該要在這裡適時的給予指引。
到了這裡,大概可以寫出以下的結構,不過這就是這題困難的地方,其實有很多的細節還沒有處理到。
classSolution:deffindStrobogrammatic(self,n:int)-> List[str]: table ={'1':'1','6':'9','8':'8','9':'6','0':'0'} ans =[]defbacktrack(curr,n):if n ==0: ans.append(curr)return#TODObacktrack(curr, n -?)backtrack('', n)return ans
第一個問題是,我們要怎麼樣不斷的窮舉使其符合 Strobogrammatic Number 的特性?應該有幾種情況
class Solution:
def findStrobogrammatic(self, n: int) -> List[str]:
table = {
'1': '1',
'6': '9',
'8': '8',
'9': '6',
'0': '0'
}
ans = []
def backtrack(curr, n):
if n == 0:
ans.append(curr)
return
# TODO
backtrack(curr, n - ?)
if n % 2 == 1:
for i in ['0', '1', '8']:
backtrack(i, n - 1)
else:
backtrack('', n)
return ans
class Solution:
def findStrobogrammatic(self, n: int) -> List[str]:
table = {
'1': '1',
'6': '9',
'8': '8',
'9': '6',
'0': '0'
}
ans = []
def backtrack(curr, n):
if n == 0:
ans.append(curr)
return
for key in table:
backtrack(key + curr + table[key], n - 2)
if n % 2 == 1:
for i in ['0', '1', '8']:
backtrack(i, n - 1)
else:
backtrack('', n)
return ans
class Solution:
def findStrobogrammatic(self, n: int) -> List[str]:
table = {
'1': '1',
'6': '9',
'8': '8',
'9': '6',
'0': '0'
}
ans = []
def backtrack(curr, n):
if n == 0:
ans.append(curr)
return
for key in table:
if n == 2 and key == '0':
continue
backtrack(key + curr + table[key], n - 2)
if n % 2 == 1:
for i in ['0', '1', '8']:
backtrack(i, n - 1)
else:
backtrack('', n)
return ans
class Solution:
def findStrobogrammatic(self, n: int) -> List[str]:
odd = ['0', '1', '8']
even = ['11', '69', '88', '96', '00']
if n == 1:
return odd
elif n == 2:
return even[:-1]
else:
if n % 2:
prevs = self.findStrobogrammatic(n-1)
candidates = odd
else:
prevs = self.findStrobogrammatic(n-2)
candidates = even
mid = (n-1)//2
ans = []
for prev in prevs:
for candidate in candidates:
ans.append(prev[:mid] + candidate + prev[mid:])
return ans