[英]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 的位向量相同。所以我們只需要計數。
00
--> "", "", 或菠蘿01
--> "", "-", 或菠蘿10
--> "-"、"" 或菠蘿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.