
Envoyé par
wiztricks
Donc si je vous donne les mots "bbaacc" et "aabb" comment faites vous pour fabriquer l'intersection (en déroulant un algo. sur une feuille de papier)?
J'écris v = "aabb" et w = "bbaacc" (pour simplifier et en remarquant que l'intersection ne sera jamais plus grande que la plus petite chaine).
Ce qui permet de reformuler l'intersection comme étant la plus grande sous chaîne de v contenue dans w.
Pour ce faire, il faut savoir fabriquer les sous-chaines de v et savoir tester la condition "est dans w".
Côté sous-chaînes de v.
Il y a celles qui commencent au premier caractère: a, aa, aab, aabb;
celles qui commencent au second: a, ab, abb; puis au 3ème: b, bb; et enfin au 4ème et dernier: b.
Le but étant de "programmer", on essaie de essaie de dérouler cela pour voir comment çà va pouvoir marcher.
1ère étape: on teste les sous-chaînes qui commencent au premier caractère.
1.0: a est dans w => intersection = a
1.1: aa est dans w et aa est plus grand que intersection =>intersection = aa
1.2: aab n'est pas dans w
Ici, on peut remarquer qu'il est inutile de tester aabb puisque aab n'est pas dans w.
2ème étape: on teste les sous-chaînes qui commencent au 2nd caractère.
On peut alors remarquer que l'intersection ayant déjà 2 caractères, inutile de tester les sous-chaines en ayant moins.
2.0: abb n'est pas dans w.
Et là on peut constater que la longueur de v étant 4, les sous-chaînes qui commencent au 3ème et 4ème caractères ont une longueur inférieure ou égale à celle de l'intersection: pas la peine de tester.
Maintenant que j'ai fait mon boulot d'analyse du problème et d'esquisse de la solution... Je peux m'aventurer à coder:
1 2 3 4 5 6 7 8 9 10 11 12 13
| def intersection(v, w):
ix = ''
min_ = min(len(v), len(w))
for s in range(len(v)):
if len(ix) >= min_ - s:
break
for e in range(s + len(ix), min_):
t = v[s:e+1]
if t not in w:
break
if len(t) >= len(ix):
ix = t
return ix |
et le code ne fait que traduire ce que j'ai raconté en "français" ni plus, ni moins.
- W
Partager