我有一個組合指派,它涉及從特定的字符串組合中獲取長度小於或等於6的每個單詞。獲取字符串的每個組合
在這種情況下,它是S = {'a','ab','ba'}。教授剛開始列出他們,但我認爲用程序可以更容易地解決這個問題。唯一的問題是我無法得到一個能夠真正計算每個可能選項的好算法。
如果有人可以幫忙,我會很感激。我通常使用Python進行編程,但實際上我只需要使用該算法的幫助。
我有一個組合指派,它涉及從特定的字符串組合中獲取長度小於或等於6的每個單詞。獲取字符串的每個組合
在這種情況下,它是S = {'a','ab','ba'}。教授剛開始列出他們,但我認爲用程序可以更容易地解決這個問題。唯一的問題是我無法得到一個能夠真正計算每個可能選項的好算法。
如果有人可以幫忙,我會很感激。我通常使用Python進行編程,但實際上我只需要使用該算法的幫助。
您可以反覆生成由一個部分,兩個部分,三個部分等組成的所有字符串,直到在一個步驟中生成的所有字符串都超過六個字符。進一步的步驟只會生成更長的字符串,因此所有可能的短字符串都已經生成。如果在每一步中收集這些短字符串,則最終會生成一組所有可能生成的短字符串。
在Python:
S = set(['a', 'ab', 'ba'])
collect = set()
step = set([''])
while step:
step = set(a+b for a in step for b in S if len(a+b) <= 6)
collect |= step
print sorted(collect)
假設你的意思是組合(不重複,順序並不重要):
import itertools
S = [ 'a', 'ab', 'ba' ]
for i in range(len(S)+1):
for c in itertools.combinations(S, i):
cc = ''.join(c)
if len(cc) <= 6:
print c
發射一切準備:
()
('a',)
('ab',)
('ba',)
('a', 'ab')
('a', 'ba')
('ab', 'ba')
('a', 'ab', 'ba')
如果你的意思是不是「組合」不同,它只是在for
(例如,itertools.permutations
或您自己設計的其他東西)中使用正確的迭代器或生成器的問題。
編輯:例如,如果你的意思是「重複和順序是很重要的」,
def reps(seq, n):
return itertools.product(*[seq]*n)
for i in range(7):
for c in reps(S, i):
cc = ''.join(c)
if len(cc) <= 6:
print c
會給你所需的85行輸出。
再次編輯:我有錯誤的循環限制(因此錯誤的輸出長度) - tx給指出的評論者。此外,如果不同元組的''.join被認爲是等價的,那麼這種方法可以產生大於1次的字符串;例如,它產生('a','ba')與('ab','a')不同,雖然它們的'.join是來自不同的所謂「組合」的相同(相同的「單詞」 - 使用中的術語不完全清楚)。
這不會創建6個字母組合,如'a''ab''ba''a' – Unknown 2009-09-22 02:24:20
這不是一個組合,因爲重複了'a'。術語**組合**在數學中有着非常明確和明確的含義(這正是itertools.combination實現的),在「組合指派」中,它使人們相信它可能被用於不穩定,不精確或者是錯誤的錯誤。 – 2009-09-22 03:03:22
問題是來自組合的字符串;不是一組組合。 – 2009-09-22 03:12:36
做這遞歸是一種方法:
cache = {}
def words_of_length(s, n=6):
# memoise results
if n in cache: return cache[n]
# base cases
if n < 0: return []
if n == 0: return [""]
# inductive case
res = set()
for x in s:
res |= set((x+y for y in words_of_length(s, n-len(x))))
# sort and memoise result
cache[n] = sorted(res)
# sort results
return cache[n]
def words_no_longer_than(s, n=6):
return sum([words_of_length(s, i) for i in range(n+1)], [])
def combos(S,n):
if (n <= 0): return
for s in S:
if len(s) <= n: yield s
for t in combos(S,n-len(s)): yield s+t
for x in combos(["a","ab","ba"],6): print x
打印輸出:
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaab
aaaaba
aaaab
aaaaba
aaaba
aaabaa
aaab
aaaba
aaabaa
aaabab
aaabba
aaba
aabaa
aabaaa
aabaab
aababa
aab
aaba
aabaa
aabaaa
aabaab
aababa
aabab
aababa
aabba
aabbaa
aba
abaa
abaaa
abaaaa
abaaab
abaaba
abaab
abaaba
ababa
ababaa
ab
aba
abaa
abaaa
abaaaa
abaaab
abaaba
abaab
abaaba
ababa
ababaa
abab
ababa
ababaa
ababab
ababba
abba
abbaa
abbaaa
abbaab
abbaba
ba
baa
baaa
baaaa
baaaaa
baaaab
baaaba
baaab
baaaba
baaba
baabaa
baab
baaba
baabaa
baabab
baabba
baba
babaa
babaaa
babaab
bababa
注意多次給出相同的字符串 - 例如,aba = a + ba = ab + a。 – 2009-09-22 05:02:01
是找這樣的事情? http://stackoverflow.com/questions/361/generate-list-of-all-possible-permutations-of-a-string – 2009-09-22 02:14:27
你能擴展你的例子嗎?可以多次選擇相同的物品嗎? – cmcginty 2009-09-22 02:47:20