Était-ce utile?

La solution

Vous pouvez faire cela efficacement avec la programmation dynamique.

L'idée principale est que vous n'avez pas besoin d'énumérer toutes les chaînes cibles possibles, vous avez juste besoin de savoir combien de façons cibles sont possibles avec K Les modifications ne considérant que la chaîne indicies après avoir.

alphabet = 'abcd'
s = [ 'aabbbb', 'bacaaa', 'dabbbb', 'cabaaa']

# use memoized from http://wiki.python.org/moin/PythonDecoratorLibrary          
@memoized
def count(edits_left, index):
  if index == -1 and edits_left >= 0:
    return 1
  if edits_left < 0:
    return 0
  ret = 0
  for char in alphabet:
    edits_used = 0
    for mutate_str in s:
      if mutate_str[index] != char:
        edits_used += 1
    ret += count(edits_left - edits_used, index - 1)
  return ret

Autres conseils

En pensant à haute voix, il me semble que ce problème se résume à un problème combinatoire.

En général, pour une chaîne S de longueur L, il y a un total de C (L, K) (coefficient binomial) positions qui peut être substitué et, par conséquent (ALPHABET_SIZE ^ K) * C (L, K) de la cible T à partir d'une distance de Hamming de K.

binomiale Coefficient peut être calculé assez facilement en utilisant la programmation dynamique et le Triangle Pascal ... Pas besoin de devenir fou dans factoriel etc ...

Maintenant que un cas de chaîne est traitée, traiter avec de multiples cordes est un peu plus délicat, car vous pourriez doubler les cibles de comptage. Intuitivement mais si S1 est loin de K S2 alors à la fois la chaîne va générer le même ensemble de la cible pour ne pas compter deux fois dans ce cas. Cette dernière affirmation est peut-être un long shot qui est pourquoi je me suis assuré de dire « intuitivement »:)

it helps,

scroll top