這個問題出現在程序設計大賽去除一些特定單詞的所有出現的最小化字符串的長度,我們仍然不知道如何解決它。如何通過反覆從字符串
問: 給定的線S和串L1名單,我們希望保持刪除子,可能是在L的所有出現,我們必須儘量減少形成最終的字符串的長度。另請注意,刪除字符串可能會啓動更多清除。
例如,
- S = ccdedefcde,L = {} CDE 然後回答= 1。因爲我們可以通過ccdedefcde減少的S - > cdefcde - > fcde - > F。
- S = aabaab,L = {AA,BB}然後回答= 0作爲還原可以通過aabaab進行 - > AABB - > AA - > '空字符串'
- S = acmmcacamapapc,L = {MCA, pa}則答案= 6,因爲可以通過acmmcacamapapc-> acmcamapapc - > acmapapc - > acmapc執行縮減。
S的最大長度可以是50和列表L的最大長度可達50
我的做法是一個基本的遞歸遍歷中,我回到了最小長度,我可以通過刪除得到不同子串。不幸的是這個遞歸方法將在最壞的情況下輸入超時,因爲我們必須在每一步50個選項和遞歸深度爲50
請提出一個高效的算法,可以解決這個問題。
您可以通過維護一套迄今爲止所遇到的減少串加快了這個問題的基本的遞歸深度優先搜索。當你看到其中的一個再次返回而不是從該字符串重複遞歸。 – mcdowella
此問題很難:即使對於| L | = 1的問題實例,貪婪的最左邊刪除算法也可能會失敗。 S = ABABAA,L = {ABA}。最左邊的貪婪會刪除[ABA] BAA離開BAA,這不能進一步降低。但是,如果您刪除AB [ABA] A以獲得ABA,則可以刪除[ABA]以獲取空字符串。 –