13

メソッド 'valid_string?' を記述します。文字列を受け入れる。角かっこ、かっこ、中かっこが正しく閉じている場合は true を返します。それ以外の場合は false を返します。

valid_string?("[ ]")                  # returns true
valid_string?("[  ")                  # returns false
valid_string?("[ ( text ) {} ]")      # returns true
valid_string?("[ ( text { ) } ]")     # returns false

私のコード: すべてに対して false を返しています。個々のケースに明示的なブール値を使用してみました {} || () || などは機能しませんでした。すべてに対して true または false を返します。それは私のドライバーコードですか?

def valid_string?(str) 

    if str == ("\[\s+]")
        true
    else
        false
    end
end

更新されたソリューション:----------------------------------------------- - はい!#マッチは間違いなくうまくいきました! 私のテストコードの最後の行はtrueと評価されていますが。false にする必要がある場合。. .

def valid_string?(str) 
if str.match "(\\[.+\\])" || "|(\\(\\))" || "|({})"
    return true
else
    return false
    end
end

puts valid_string?("[ ]")                  # returns true
puts valid_string?("[  ")                  # returns false
puts valid_string?("[ ( text ) {} ]")      # returns true
puts valid_string?("[ ( text { ) } ]")     # returns false
4

5 に答える 5

6

楽しかったので、先に進んでこのThe Ruby Wayを解決しました:)

class Brackets
  class Bracket
    def initialize(open, close)
      @open = open
      @close = close
      @match_count = 0
    end
    attr_reader :match_count, :open, :close

    def check(c)
      @match_count += 1 if c == @open
      @match_count -= 1 if c == @close
    end
  end

  def initialize
    @brackets = []
    @stack = []
    @valid = true
  end

  def add(open, close)
    @brackets << Bracket.new(open,close)
  end

  def check(c)
    @brackets.each do |b|
      b.check(c)
      @stack.push(c) if c == b.open
      @valid = false if c == b.close and @stack.pop != b.open
    end
  end

  def valid?
    total = 0
    @brackets.each { |b| total += b.match_count }
    total == 0 && @valid == true
  end
end

def valid_string?(str)
  brackets = Brackets.new
  brackets.add('[', ']')
  brackets.add('{', '}')
  brackets.add('(', ')')

  str.each_char { |c| brackets.check(c) }
  brackets.valid?
end

# Our tests
puts valid_string?("[ ]") ? 'true' : 'false'                 # returns true
puts valid_string?("[  ") ? 'true' : 'false'                 # returns false
puts valid_string?("[ ( text ) {} ]") ? 'true' : 'false'     # returns true
puts valid_string?("[ ( text { ) } ]") ? 'true' : 'false'    # returns false
puts valid_string?("[ ( text { } ) ]") ? 'true' : 'false'    # returns true
于 2013-12-23T22:08:57.380 に答える
5

正規表現を使用しない方法は次のとおりです。

def valid_string?(str)
  strim = str.gsub(/[^\[\]\(\)\{\}]/,'')
  return true if strim.empty?
  return false if strim.size.odd?
  loop do  
    s = strim.gsub('()','').gsub('[]','').gsub('{}','')
    return true if s.empty?
    return false if s == strim
    strim = s
  end   
end

p valid_string?("[ ]")               # => true
p valid_string?("[  ")               # => false
p valid_string?("[ ( text ) {} ]")   # => true
p valid_string?("[ ( text { ) } ]")  # => false
p valid_string?("[ ( text { more text { (more text) }} )]")  # => true
  • まず、「()[]{}」以外のすべての文字を削除します。
  • 残りの文字列が空の場合、true を返します
  • 残りの文字列に含まれる文字数が奇数の場合は、false を返します。
  • 隣接するペア '()'、'[]' および '[]' の削除を続けて、文字列が空になるまで (この場合は true を返します)、または隣接するペアを削除できなくなり、文字列が空でなくなるまで (この場合) false を返します。
于 2013-12-23T18:13:34.890 に答える
2

簡単なカウントルーチンはどうですか?

def valid_string?(str)
  match_count = 0

  str.each_char do |c|
    match_count += 1 if [ '[', '{', '(' ].include?(c)
    match_count -= 1 if [ ']', '}', ')' ].include?(c)
  end

  return match_count == 0
end
于 2013-12-23T18:39:08.440 に答える