簡體   English   中英

找出可以按音節分割單詞的所有可能方式

[英]Find all the possible ways a word can be split by syllables

我不知道如何最好地表達這個問題,但是給定單詞pineapple ,並且給定它的音節在數組中,例如["pine", "ap", "ple"] ,我需要找到單詞的所有可能方式可以通過它的音節來分割。 function 將產生以下結果:

[["pineapple"], ["pine", "apple"], ["pine", "ap", "ple"], ["pineap", "ple"]]

我相信我之前遇到過一個非常相似的 leetcode/algoexpert 類型的問題,但似乎不記得它到底是什么。

注意:音節必須有序,所以 [“pineple”, “ap”] 無效。

給定單詞的 N 個音節,音節之間有 N-1 個位置。 對於每個這樣的 position,您可以決定是在此處拆分單詞還是將它們連接在一起。 有 2 N-1種方法可以做出這些選擇,每種方法都會產生不同的單詞分區。

這是一種簡單的迭代方法,通過從 0 計數到 2 N-1並使用當前計數中的每一位來決定一個拆分來做出這些選擇:

def splits(syls):
    if len(syls) < 2:
        return syls
    for count in range(1<<(len(syls)-1)):
        list = [syls[0]]
        for pos in range(1,len(syls)):
            if (count & (1<<(pos-1))) == 0:
                list[-1]+=syls[pos]
            else:
                list.append(syls[pos])
        print(list)

splits(["pine", "ap", "ple"])

Output:

['pineapple']
['pine', 'apple']    
['pineap', 'ple']    
['pine', 'ap', 'ple']

在 python 中,拼寫為["pine", "ap", "ple"] ,但在 TeX 中拼寫為pine-ap-ple ,同樣的。 N+1 個音節的向量表示 N 個標點符號的向量,其中標記可以是“ - ”連字符或“”空。

這與長度為 N 的位向量相同。所以我們只需要計數。

  1. 00 --> "", "", 或菠蘿
  2. 01 --> "", "-", 或菠蘿
  3. 10 --> "-"、"" 或菠蘿
  4. 11 --> "-"、"-" 或松蘋果

你可以看到

fmt = f'0{n}b'  # e.g. '02b'
for i in range(2 ** n):
    print(format(i, fmt))

那么就只需要組裝相應的列表即可。

itertools.product與 [True, False] 一起使用:

真:做拆分

錯誤:不拆分

from itertools import product

A = ["pine", "ap", "ple"]
ans = []
for comb in product([True, False], repeat=len(A) - 1):
    comb = [True] + list(comb)
    a = []
    for doSplit, syllables in zip(comb, A):
        if doSplit:
            a.append(syllables)
        else:
            a[-1] += syllables
    ans.append(a)
print(ans)
[['pine', 'ap', 'ple'], ['pine', 'apple'], ['pineap', 'ple'], ['pineapple']]

暫無
暫無

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

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