href="http://ounix1xcw.bkt.clouddn.com/github.markdown.css" rel="stylesheet">
这是leetcode的第91题--Longest Palindromic Substring
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26 Given an encoded message containing digits, determine the total number of ways to decode it.
For example, Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).
The number of ways decoding "12" is 2.
思路 这道题用动态规划,可以发现, [ f(n 1)=\begin{cases} f(n),\quad when \ \ p(s[n]) \ f(n-k)*fib(k),\quad when\ p(s[k]),p(s[k 1]) ...p(s[n]) >0 \end{cases} ] f(n)表示位数有多少种, fib(N)求fibnaci数列,fib(0)=1,fi(1)=1 ,p(s[n])表示满足性质,大体上是这未为1或2,这样就可能有多种选择, 但要考虑27,28,29,不存在,以及,下一位为0的时候也不算, 具体实现见代码 注意到当后k位都满足p时, 则分步计数,f(n-k) 已经算出,求后面k位有多少种,即时fib数列,然后乘起来即可
show me the code
class Solution: def numDecodings(self, s): """ :type s: str :rtype: int """ if not s or s[0]=='0':return 0 self.fibNum = [1,1] ct = 0 cur = 1 n = len(s) for i in range(n): #print(i,cur,ct) if s[i]=='1' or s[i]=='2' : if i==n-1:ct =1 elif not(s[i 1]=='0' or (s[i]=='2' and s[i 1]>'6')): ct =1 elif s[i] == '0' and (s[i-1] >'2' or s[i-1]=='0'):return 0 else: if s[i]=='0': cur*= self.fib(ct) else:cur*= self.fib(ct 1) ct=0 else:cur*= self.fib(ct) return cur def fib(self,n): sz=len(self.fibNum) if n<sz: return self.fibNum[n] a,b = self.fibNum[-2:] for i in range(sz,n 1): a,b = b,a b self.fibNum.append(b) return self.fibNum[n]