Python程式:計算將數字字串拆分為列表的方案數


假設我們有一個字串 s。s 包含數字 0 到 9,我們還有一個數字 k。我們需要找到 s 可以表示為 [1, k] 中數字列表的不同方式的數量。如果答案非常大,則返回結果模 10^9 + 7。

因此,如果輸入類似於 s = "3456" k = 500,則輸出將為 7,因為我們可以將 s 表示為 [3, 4, 5, 6]、[34, 5, 6]、[3, 4, 56]、[3, 45, 6]、[34, 56]、[345, 6]、[3, 456]

為了解決這個問題,我們將遵循以下步驟:

  • m := 10^9 + 7

  • N := s 的大小

  • dp := 大小為 (N + 1) 的列表,並填充 0

  • dp[N] := 1

  • 對於 i 從 N − 1 到 0,遞減 1,執行以下操作:

    • curr_val := 0

    • 對於 j 從 i 到 N,執行以下操作:

      • curr_val := curr_val * 10 + (s[j] 作為數字)

      • 如果 curr_val 在 1 到 k 的範圍內,則

        • dp[i] :=(dp[i] + dp[j + 1]) mod m

      • 否則,

        • 退出迴圈

  • 返回 dp[0]

讓我們看看以下實現以更好地理解:

示例

即時演示

class Solution:
   def solve(self, s, k):
      m = 10 ** 9 + 7
      N = len(s)
      dp = [0] * (N + 1)
      dp[N] = 1
      for i in range(N − 1, −1, −1):
         curr_val = 0
         for j in range(i, N):
            curr_val = curr_val * 10 + int(s[j])
            if 1 <= curr_val <= k:
               dp[i] = (dp[i] + dp[j + 1]) % m
            else:
               break
      return dp[0]
ob = Solution()
s = "3456"
k = 500
print(ob.solve(s, k))

輸入

"3456", 500

輸出

7

更新於: 2020-12-26

79 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.