What's the fastest way to check if a word from one string is in another string?

后端 未结 8 924
故里飘歌
故里飘歌 2020-12-30 12:56

I have a string of words; let\'s call them bad:

bad = \"foo bar baz\"

I can keep this string as a whitespace separated string,

相关标签:
8条回答
  • 2020-12-30 13:40

    The include? method is what you need. The ruby String specificacion says:

    str.include?( string ) -> true or false Returns true if str contains the given string or character.

    "hello".include? "lo" -> true

    "hello".include? "ol" -> false

    "hello".include? ?h -> true

    Note that it has O(n) and what you purposed is O(n^2)

    0 讨论(0)
  • 2020-12-30 13:42

    Here's one that will check for words and phrases.

     def checkContent(str)
         bad = ["foo", "bar", "this place sucks", "or whatever"]
    
         # may be best to map and singularize everything as well. 
         # maybe add some regex to catch those pesky, "How i make $69 dollars each second online..."
         # maybe apply some comparison stuff to check for weird characters in those pesky, "How i m4ke $69 $ollars an hour"
    
    
         bad_hash = {}
         bad_phrase_hash = {}
    
         bad.map(&:downcase).each do |word|
             words = word.split().map(&:downcase)
             if words.length > 1
                 words.each do |inner|
                    if bad_hash.key?(inner)
                        if bad_hash[inner].is_a?(Hash) && !bad_hash[inner].key?(words.length)
                             bad_hash[inner][words.length] = true
                        elsif bad_hash[inner] === 1
                            bad_hash[inner] = {1=>true,words.length => true}
                        end
                    else
                        bad_hash[inner] = {words.length => true}
                    end
                 end
                 bad_phrase_hash[word] = true
             else
                 bad_hash[word] = 1
             end
         end
    
         string = str.split().map(&:downcase)
         string.each_with_index do |word,index|
            if bad_hash.key?(word)
                if bad_hash[word].is_a?(Hash)
                    if bad_hash[word].key?(1)
                        return false
                    else
                        bad_hash[word].keys.sort.each do |length|
                            value = string[index...(index + length)].join(" ")
                            if bad_phrase_hash.key?(value)
                                return false
                            end
                        end
                    end
                else
                    return false
                end
            end
         end
         return true
      end
    
    0 讨论(0)
提交回复
热议问题