Cette approche est légèrement différente de la vôtre, mais je crois qu'il sera facile à mettre en œuvre par programme. Je ne suis pas sûr que c'est la performance optimale sage, mais je vais vous laisser :-)
D'abord vous avez besoin d'un dictionnaire de tous les mots juridiques que vous voulez être en mesure de faire correspondre. Créez une table "Dictionary" ou "Words" dans votre base de données, avec la première colonne stockant le mot actuel, la deuxième colonne stockant le mot converti en majuscules ou minuscules pour faciliter la comparaison, puis une colonne entière pour chaque lettre dans l'alphabet AZ.
Importez votre fichier de dictionnaire dans cette table, et comptez par programme le nombre de fois que chaque lettre de l'alphabet apparaît dans ce mot, et stockez ce nombre dans la colonne pour cette lettre.
Exemple Parole: aide-comptable
Mémorisez le mot "comptable" dans la colonne de texte, 1 dans votre "b", "p" et "r" colonnes, 2 dans votre "o" et " k "colonnes, et 3 dans votre colonne" e ".
Une fois que vous avez votre dictionnaire entier importé avec nombre de lettres, vous pouvez déterminer assez facilement tous les sous-mots possibles en un mot donné en utilisant la méthode suivante:
- Compter les lettres dans votre chaîne.
- Composer une requête SQL qui renvoie tous les mots de votre table de dictionnaire qui n'utilisent pas les lettres non trouvées dans votre mot donné, ou qui ont plus d'une lettre particulière qu'existe dans votre mot.
Vous pouvez y parvenir en faisant une en mémoire tableau avec 26 positions représentant l'alphabet
Exemple mot: véhicule
SELECT Word FROM Dictionary WHERE NOT (
(a >= 1) OR (b >= 1) OR (c >= 2) ... OR (z >= 1)
)
Ainsi un mot dans votre dictionnaire qui a un ' a 'ou' z 'sont exclus, car la requête filtrera tous les mots dont le compte' a 'ou' z 'est au moins un, et tout mot qui utilise plus d'un' c 'est filtré .
Vous pouvez facilement générer toutes les conditions "OR" par programmation en utilisant un tableau de 26 entiers, tous commençant à 1, puis parcourir votre mot, en ajoutant 1 à la valeur tableau appropriée de chaque lettre que vous trouvez.
MISE À JOUR - décompte final exemple de code
Pardonnez mon exemple de code ci-dessous - il va être en ASP (VBScript) - mais vous devriez être en mesure de saisir et de traduire en PHP, ou une personne aimable le faire pour toi sinon.
Const AsciiCodeLowerCaseA = 97
InputWord = "Carrots"
LowerCaseInputWord = LCase(InputWord)
Dim LetterCount(26)
for i = 1 to 26
LetterCount(i) = 1
next
for j = 1 to Len(InputWord)
CurrentLetter = Mid(InputWord, j, 1)
AsciiCode = Chr(CurrentLetter)
AlphabetPos = AsciiCode - AsciiCodeLowerCaseA + 1
LetterCount(AlphabetPos) = LetterCount(AlphabetPos) + 1
next
En convertissant chaque lettre du mot à sa valeur ASCII, puis en soustrayant le code ascii pour en minuscules « a » et en ajoutant 1, vous obtenez la position de cette lettre dans l'alphabet de 1 à 26. Vous Maintenant, ajoutez 1 à cette position dans le tableau.
Il semble contre-intuitif, mais initialise toutes les lettres à 1 dans votre tableau. Lorsque vous générez l'instruction SQL, vous éliminez tous les mots dont le nombre de lettres est supérieur à votre mot d'entrée. Ainsi, si une lettre n'apparaît pas dans le mot d'origine, vous filtrez les mots contenant une ou plusieurs lettres. Si la lettre apparaît une fois, vous filtrez les mots qui ont deux lettres ou plus, et ainsi de suite.
Ce serait probablement, mais il semble un long chemin. Je ne peux penser à rien de mieux en ce moment, mais je * pense * qu'il y a un moyen plus facile ... en quelque sorte. Bonne idée. –
J'essaie de comprendre exactement ce que vous voulez dire. Voulez-vous dire que l'arrestation reviendrait en tant que regard, oreille ou repos? Ou qu'un mot se combinerait avec un autre, égalant toujours le nombre de caractères dans l'anagramme original. –
Alors "arrestation" devient "arrestation" avant de commencer. Notez le nouvel espace à la fin. Certaines itérations vont revenir "r staer". Aucun mot n'a de sens. L'itération suivante retournera "r regard". Aha! "regard"! Finalement, on retournera "ar rest". Un autre retournera "star re". Etc. –