8
votes

Vérifiez si une chaîne contient tous les caractères d'une autre chaîne de Ruby

Disons que j'ai une chaîne, comme 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).

J'ai besoin de vérifier si 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 commentaires

Veuillez modifier pour clarifier deux points. 1. Pour String Pour inclure "sorcier", DOIT String contient au moins trois "R" S? 2. Pourquoi votre deuxième exemple renvoie-t-il faux ?


@CarySwoveland Je pense qu'il montre comment Ruby's Inclure? Works et le résultat false est indésirable. Je pense que la question est de savoir comment assurer que les deux cas retournent vrai .


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) est bien mais m (x, y) est une erreur de syntaxe. Votre string .include? ("sorcier") 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 doit contenir ce type r S le mot sorcier a réellement!


4 Réponses :


1
votes
  1. Créez un tableau 2 dimensions hors de votre banque Letter Bank, pour associer le nombre de lettres à chaque lettre.

  2. Créez un tableau 2 dimensions hors de la chaîne Harry Potter de la même manière.

  3. boucle à travers les deux et faire des comparaisons.

    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.


0 commentaires

12
votes

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: xxx pré>

é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


0 commentaires

5
votes

Je présume que si la chaîne à cocher est "sorcier", 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. xxx pré>

si les caractères de la cible doivent non seulement être dans str code>, mais doivent être dans le même ordre, nous pourrions écrire: P> xxx pré>

(ou !! (str = ~ r) # => true code>) p>

target = "harrypotterandtheasorcerersstone"
r = Regexp.new "#{ target.chars.join "\.*" }"
  #=>  /h.*a.*r.*r.*y* ... o.*n.*e/
str =~ r
  #=> nil


0 commentaires

2
votes

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> xxx pré>

Vous pouvez trier votre chaîne de sujet en utilisant .chars.sort.join code> ... p> xxx pré>

puis produisez une liste de substrings à rechercher: p>

search.all? { |c| subject[c] }


0 commentaires