簡體   English   中英

從子字符串列表構造目標字符串

[英]Construct a target string from a list of substrings

我正在做一個小項目,我需要安排將 output 成為目標字符串的現有子字符串。 不過,我在處理一個特殊情況時遇到了麻煩。 假設我想形成句子:

“棕狐很酷。”

我得到了輸入

[“棕狐”、“The”、“棕”、“酷”]

如果我天真地實現這一點,我會逐字 go 並開始形成“The”+“Brown”,只是意識到我實際上必須以“The Brown Fox”開頭。 也可能是無法創建目標字符串的情況。

這聽起來有點像動態編程,但我無法將其形式化並處理我上面提到的兩種情況。 有人介意給我一些幫助,或者指出我可以閱讀類似問題的地方嗎?

首先讓我們舉個例子來更好地理解:

示例 1:

輸入:

target = "棕狐很酷。"

arr = [“棕色狐狸”,“The”,“棕色”,“很酷”]

Output:

真的

示例 2:

輸入:

target = "棕狐很酷。"

arr = ["The brown", "The", "brown", "iscool"]

Output:

錯誤的

示例 3:

輸入:

target = "棕狐很酷。"

arr = ["棕狐是", "The", "棕狐", "很酷"]

Output:

真的

解釋:

即使你總是選擇最大匹配的 substring,你也不會得到正確的答案。

遞歸方法:

步驟 1:使用您當前的索引與列表的字符串匹配,即 arr。

步驟 2:對於 arr 的每個元素,首先您必須從索引中匹配目標字符串。

Step-3:如果匹配,您需要通過增加其索引來查找是否可以匹配剩余的目標字符串。

Step-4:因此在遞歸結束時,您將根據它們的返回值知道它是否可能(真)或不(假)。

Python 代碼:

def match_string(string, target, index):
    lens = len(string)
    lent = len(target)
    
    if(index + lens > lent):
        return False
    
    for i in range(index,index+lens):
        if(string[i-index] != target[i]):
            return False
    
    if(target[index+lens] == " " or target[index+lens] == "."):
        return True
    else:
        return False

    
def solve(arr,target,index):
    
    n = len(arr)
    ln = len(target)
    
    if(index == ln):
        return True
    elif(index > ln):
        return False
    
    result = False
    for em in arr:
        if(match_string(em,target,index)):
            result = result or solve(arr,target,index+len(em)+1)
    return result
   

target = "The brown fox is cool."
arr    = ["The brown", "The", "brown","fox", "is cool"]
answer = solve(arr,target,0)

動態規划方法:

只需使用索引來記住每個遞歸步驟的結果。

def match_string(string, target, index):
    lens = len(string)
    lent = len(target)
    
    if(index + lens > lent):
        return False
    
    for i in range(index,index+lens):
        if(string[i-index] != target[i]):
            return False
    
    if(target[index+lens] == " " or target[index+lens] == "."):
        return True
    else:
        return False

    
def solve(arr,target,index,dp):
    
    n = len(arr)
    ln = len(target)
    
    if(index == ln):
        return True
    elif(index > ln):
        return False
    
    if(dp[index] != None):
        return dp[index]
    
    result = False
    for em in arr:
        if(match_string(em,target,index)):
            result = result or solve(arr,target,index+len(em)+1,dp)
    dp[index] = result
    return dp[index]
    

target = "The brown fox is cool."
arr    = ["The brown fox", "The", "brown", "is cool"]
dp = [None for i in range(len(target))]
answer = solve(arr,target,0,dp)
print(answer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM