Sからの各文字は、S2に含まれていても、そうでなくてもよい。我々は2例をしようと再帰構築することが可能で:Sの
- を最初の文字をカバーするために使用されている、Sの
- 最初の文字は、カバーに使用 ない
との最小値を計算しますこれらの2つのカバー。これを実装するには、すでに選択されているS2 +反転(S2)でSのどれがカバーされているかを追跡すれば十分です。
どのような結果が(カバーが見つかり、カバーできない)最適化があり、何かをカバーしない場合はカバーの最初の文字を取る必要はありません。
シンプルなPython実装:
cache = {}
def S2(S, to_cover):
if not to_cover: # Covered
return ''
if not S: # Not covered
return None
if len(to_cover) > 2*len(S): # Can't cover
return None
key = (S, to_cover)
if key not in cache:
without_char = S2(S[1:], to_cover) # Calculate with first character skipped
cache[key] = without_char
_f = to_cover[0] == S[0]
_l = to_cover[-1] == S[0]
if _f or _l:
# Calculate with first character used
with_char = S2(S[1:], to_cover[int(_f):len(to_cover)-int(_l)])
if with_char is not None:
with_char = S[0] + with_char # Append char to result
if without_char is None or len(with_char) <= len(without_char):
cache[key] = with_char
return cache[key]
s = '21211233123123213213131212122111312113221122132121221212321212112121321212121132'
c = S2(s, s)
print len(s), s
print len(c), c
はO(n^3)溶液は許容していますか? – Sayakiss
いいえ、私はO(n^3)より良い解決策が必要です。 – LTim