Disons que j'ai une chaîne, comme J'ai besoin de vérifier si string = "aasmflathesorcerersnstonedksaottersapldrrysaahf" code>. Si vous n'avez pas remarqué, vous pouvez trouver la phrase "harry potter et les sorciers pierre" code> là-bas (moins l'espace). chaîne code > Contient tous les éléments de la chaîne. P> string.include? ("sorcerer") #=> true
string.include? ("harrypotterandtheasorcerersstone") #=> false, even though it contains all the letters to spell harrypotterandthesorcerersstone
4 Réponses :
Créez un tableau 2 dimensions hors de votre banque code> Letter Bank, pour associer le nombre de lettres à chaque lettre. P> li>
Créez un tableau 2 dimensions hors de la chaîne Harry Potter de la même manière. P> li>
boucle à travers les deux et faire des comparaisons. P> li> ol>
Je n'ai aucune expérience dans Ruby, mais c'est comme ça que je commencerais à l'aborder dans la langue que je connais le plus, qui est Java. P>
Les ensembles et l'intersection de la matrice ne représentent pas les caractères répétés, mais un histogramme / compteur de fréquence fait: écrire votre propre tableau Fréquence code> Si vous ne voulez pas la dépendance des facettes. P> class Array
def frequency
Hash.new(0).tap { |counts| each { |v| counts[v] += 1 } }
end
end
Je présume que si la chaîne à cocher est "sorcier", si les caractères de la cible doivent non seulement être dans (ou chaîne code> doit inclure, par exemple, trois "R". Si oui, vous pouvez utiliser la méthode tableau # différence , que j'ai proposé d'être ajouté à Le noyau de rubis. str code>, mais doivent être dans le même ordre, nous pourrions écrire: P> !! (str = ~ r) # => true code>) p> target = "harrypotterandtheasorcerersstone"
r = Regexp.new "#{ target.chars.join "\.*" }"
#=> /h.*a.*r.*r.*y* ... o.*n.*e/
str =~ r
#=> nil
une solution différente non nécessairement meilleure à l'aide de tableaux de caractères triés et de sous-chaînes:
Compte tenu de vos deux chaînes ... p> Vous pouvez trier votre chaîne de sujet en utilisant puis produisez une liste de substrings à rechercher: p> .chars.sort.join code> ... p> search.all? { |c| subject[c] }
Veuillez modifier pour clarifier deux points. 1. Pour
String Code> Pour inclure "sorcier", DOIT CODE> String CODE> contient au moins trois "R" S? 2. Pourquoi votre deuxième exemple renvoie-t-ilfaux code>?@CarySwoveland Je pense qu'il montre comment Ruby's
Inclure? Code> Works et le résultat code> false code> est indésirable. Je pense que la question est de savoir comment assurer que les deux cas retournentvrai code>.PS: Si vous allez utiliser des parenthèses avec vos appels de méthode (et souvent, ils sont nécessaires), soyez prudent avec vos espaces:
m (x, y) code> est bien maism (x, y) code> est une erreur de syntaxe. Votre string.include? ("sorcier") code> fonctionne bien car il n'y a qu'un seul argument afin que votre groupe-parenthèses forme toujours une expression valide.Bonjour Cary, Meegar a raison. C'est comme une version d'inclure qui fonctionne avec une chaîne mélangée. Par conséquent,
sorcier code> doit contenir ce typer code> S le motsorcier code> a réellement!