|
楼主 |
发表于 2017-6-19 10:54:23
|
显示全部楼层
本帖最后由 jerryxjr1220 于 2017-6-19 10:55 编辑
其实,对于这题我也写了一个,用的思路是递归插入法。
把“母字符串”拆成“head”和“tail”两部分,每次在“tail”中插入子字符串,插入完以后就归到“head”中,以此类推。
- def solve(L):
- def gen_sub(string, tail, head=''):
- if len(string) == 1:
- if string in tail:
- return head + tail
- else:
- return head + string + tail
- else:
- if string[0] in tail:
- return gen_sub(string[1:], tail[tail.find(string[0]) + 1:], head + tail[:tail.find(string[0]) + 1])
- else:
- return gen_sub(string[1:], tail[:], head + string[0])
- from itertools import permutations as p
- res = []
- for each in p(L):
- s = ''
- for l in each:
- s = gen_sub(l, s)
- res.append(s)
- return min(res, key=lambda s: len(s))
- Test = [['1', '2', '3', '4'],
- ['AB', 'BC', 'AC', 'CB', 'BA'],
- ['ABC', 'BCA', 'DAC', 'CDB', 'BDB'],
- ['ACBD', 'ADBC', 'CBDD', 'CABD'],
- ['AHCBDK', 'ADBEKC', 'ECBDGD', 'CABGHD'],
- ['ARTIST', 'TARGET', 'CARTER', 'STARTS', 'GREATS', 'EARSET']]
- for test in Test:
- print(test, solve(test), len(solve(test)))
复制代码
['1', '2', '3', '4'] 4321 4
['AB', 'BC', 'AC', 'CB', 'BA'] BACB 4
['ABC', 'BCA', 'DAC', 'CDB', 'BDB'] BCDABC 6
['ACBD', 'ADBC', 'CBDD', 'CABD'] ACABDDBC 8
['AHCBDK', 'ADBEKC', 'ECBDGD', 'CABGHD'] ECABDGHCBEDKC 13
['ARTIST', 'TARGET', 'CARTER', 'STARTS', 'GREATS', 'EARSET'] GCARTEISTARGTSET 16 |
|