Voici une manière simple.
def isComposedOf(A, B):
bset = set(B)
for c in A:
if c not in bset:
return False
return True
Cet algorithme marche chaque chaîne une fois, il fonctionne en O (len (A) + len (B)) temps.
Lorsque la réponse est oui, vous ne pouvez pas faire mieux que des comparaisons len (A) même dans le meilleur des cas, car peu importe ce que vous devez vérifier chaque lettre.Et dans le pire des cas, l'un des caractères de A est caché très profondément dans B. Donc O (len (A) + len (B)) est optimal, en ce qui concerne les performances du pire cas. De même: lorsque la réponse est non, vous ne pouvez pas faire mieux que les comparaisons len (B) même dans le meilleur des cas; et dans le pire des cas, le caractère qui n'est pas dans B est caché très profondément dans A. Donc O (len (A) + len (B)) est de nouveau optimal.
Vous pouvez réduire le facteur constant en utilisant une meilleure structure de données pour bset
. Vous pouvez éviter de balayer tout B dans certains cas (non pires) où la réponse est oui en le construisant paresseusement, en scannant plus de B chaque fois que vous trouvez un caractère dans A que vous n'aviez pas vu auparavant.
wow! me battre de 2 secondes. –
Peut-être que c'est une réponse facétieuse, mais je ne pense pas que c'est vraiment ce que demandait @skydoor. L'exemple et le titre de la question indiquent clairement qu'il veut déterminer si tous les caractères d'une chaîne particulière apparaissent dans une autre chaîne. –