[英]Finding sum of all integer substring using dynamic programming
我正在解決來自hackerrank 的Sam 和子字符串問題。 它基本上是找到具有所有整數的字符串的所有子字符串的總和。
薩曼莎和山姆正在玩數字游戲。 給定一個數字作為字符串,沒有前導零,確定字符串子字符串的所有 integer 值的總和。
給定一個 integer 作為字符串,將其所有子字符串轉換為整數。 隨着數字可能變大,返回模 10⁹ + 7 的值。
示例:
n = '42'
這里n是一個字符串,它包含三個 integer 子字符串:4、2 和 42。它們的和是 48,並且 48 模 10⁹ + 7 = 48。
在下面的編輯器中完成子字符串 function。 substrings 具有以下參數: string n:integer 的字符串表示形式
int: n中所有子串的 integer 值之和,取模 (10⁹ + 7)
我嘗試使用記憶化遵循遞歸自上而下的動態問題解決方案:
from functools import cache
def substrings(n):
@cache
def substrSum(curIndex):
if curIndex == 0: return int(n[0])
return substrSum(curIndex-1)*10 + int(n[curIndex]) * (curIndex+1)
totalSum = 0
for i in range(len(n)-1, -1,-1):
totalSum += substrSum(i)
return totalSum % (10 ** 9 + 7)
我還嘗試了帶有記憶的遞歸自下而上動態編程解決方案(這僅for
更改循環計數方向):
from functools import cache
def substrings(n):
@cache
def substrSum(curIndex):
if curIndex == 0: return int(n[0])
return substrSum(curIndex-1)*10 + int(n[curIndex]) * (curIndex+1)
totalSum = 0
for i in range(len(n)):
totalSum += substrSum(i)
return totalSum % (10 ** 9 + 7)
對於自上而下的解決方案在 13 個測試用例中有 8 個給出運行時錯誤,而自下而上的解決方案在 13 個測試用例中的 6 個中給出運行時錯誤。 我在哪里犯錯?
您的算法是正確的(兩個版本),但是 HackerRank 將使用具有數千位數字的字符串進行測試,並且當您對每個數字執行遞歸調用時,您的第一個代碼會遇到最大遞歸深度超出錯誤,而第二個代碼會運行進入 memory 錯誤(想想緩存)。
應該注意的是,他們對約束的措辭是錯誤的。 受 2 x 10 5限制的不是n “轉換為整數”的值,而是n中的位數。 我檢查了這一點,他們的一項測試涉及大約 199000 位數字的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.