某個程式本來應該輸出乙個整數陣列。但是這個程式忘記輸出空格了以致輸出了乙個數字字串,我們所知道的資訊只有:陣列中所有整數都在 [1, k] 之間,且陣列中的數字都沒有前導 0 。給你字串 s 和整數 k 。可能會有多種不同的陣列恢復結果。
按照上述程式,請你返回所有可能輸出字串 s 的陣列方案數。
由於陣列方案數可能會很大,請你返回它對 10^9 + 7 取餘 後的結果。
示例 1:
輸入:s = 「1000」, k = 10000
輸出:1
解釋:唯一一種可能的陣列方案是 [1000]
示例 2:
輸入:s = 「1000」, k = 10
輸出:0
解釋:不存在任何陣列方案滿足所有整數都 >= 1 且 <= 10 同時輸出結果為 s 。
示例 3:
輸入:s = 「1317」, k = 2000
輸出:8
解釋:可行的陣列方案為 [1317],[131,7],[13,17],[1,317],[13,1,7],[1,31,7],[1,3,17],[1,3,1,7]
示例 4:
輸入:s = 「2020」, k = 30
輸出:1
解釋:唯一可能的陣列方案是 [20,20] 。 [2020] 不是可行的陣列方案,原因是 2020 > 30 。 [2,020] 也不是可行的陣列方案,因為 020 含有前導 0 。
解題思路:使用從後往前的動態規劃解決
從前往後的動態規劃也可以解決,不過考慮情況比較繁瑣.
舉例說明: 對於字串"1234567890",k為90,假設我們此時遍歷"6",首先考慮拆分為"6"和剩下"7890"的組合方式,再討論"67"和"890"的組合方式,以此類推…
因為在求解i位置時時大於i的位置是已經求過的,故可用dp陣列記錄後面已經求過的結果. 由於k的限制,字首(也就是上例中的"6",「67」…)一旦超過90就要跳出內層迴圈
最後dp[i]的值就是內層遍歷的累加值
class
solution
:def
numberofarrays
(self, s:
str, k:
int)
->
int:
dp =[0
for i in
range
(len
(s)+1)
] dp[-1
]=1for i in
range
(len
(s)-1,
-1,-
1):# 數字不可能以0開頭
if s[i]
=='0'
: dp[i]=0
continue
for j in
range
(i,len
(s)):if
int(s[i: j +1]
)> k:
break
dp[i]
=(dp[i]
+ dp[j +1]
)%(pow(10
,9)+
7)return dp[
0]
字串,字串陣列,字串指標!!
字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...
無冗餘輸入字串 字串陣列 字串陣列
問題 輸入乙個數字n,接下來輸入n個字串,要求無冗餘地儲存字串 分析 參考到無冗餘地字串輸入 使用動態分配。本題還參考了這個鏈結的內容 1 include include int main char p int ns,i scanf d ns p char malloc sizeof char fo...
字串 字串陣列 字元陣列的區別
string a newstring 字串 string a newstring 5 字串陣列 char a newchar 5 字元陣列 string a newstring abc 字串 string a newstring 字串陣列的賦值 string a 字串陣列的初始化 char a ne...