2016-02-27 113 views
-1

所以我試圖解決一個挑戰,如果perens是在正確的順序,我返回true;否則,當然是錯誤的。我想出了代碼是在這裏:如何通過perens分隔字符串而不會丟失perens?紅寶石

def valid_parentheses(str) 
    return false if str.length % 2 == 1 
     begin 
      eval(str) 
     rescue SyntaxError 
      false 
     else 
      true 
     end 
    end 
end 

就像一個魅力除了像valid_parentheses("hi(hi)()")這應該回報# => true情況而是返回false因爲結束()的報價,所享有不必要的,因此引發錯誤。

我試圖用括號把它分離出來,但:

str.split(/\(.*\)) 
# =>"hi" 

,因爲它刪除了所有的括號和:

str.scan(/\(.*\)) 
#=> "(hi)()" 

,因爲它在技術上仍與(開始,以)結束。

我該如何拆分以分別得到"(hi)""()"

+0

你能解釋清楚你想達到一個或幾個例子輸入字符串和相應的預期結果是什麼?如果我理解得很好,你想檢查括號是否平衡,不是嗎?我已經可以說,'split'這個方法並不適用。爲什麼這個奇怪的測試'如果str.length%2 == 1'返回false? *(注意'== 1'沒用,而不是使用模數,你可以檢查最後一位)* –

回答

0

有幾種方法可以做到這一點。一種是首先刪除除"("")"以外的所有字符,然後在一個循環中刪除子字符"()",直到不再有這樣的對可以被刪除。如果字符串然後是空的,那麼parens是平衡的;否則他們不是。

def balanced_parens?(str) 
    pstr = str.gsub(/[^()]/,"") 
    puts "pstr=#{pstr}" 
    while pstr.gsub!("()", "") 
    end 
    pstr.empty? 
end 

balanced_parens? "Now (is(the(time)to(have(fun)))fun)" 
    #=> true 
balanced_parens? "Now (is(the)time)to(have)fun)((fun)" 
    #=> false 

這裏是一步一步的,這兩個字符串:

str = "Now (is(the(time)to(have(fun)))fun)" 
pstr = str.gsub(/[^()]/,"") 
    #=> "((()(())))" 
pstr.gsub!("()", "") 
    #=> "((()))" 
pstr.gsub!("()", "") 
    #=> "(())" 
pstr.gsub!("()", "") 
    #=> "()" 
pstr.gsub!("()", "") 
    #=> "" 
pstr.gsub!("()", "") 
    #=> nil 
pstr.empty? 
    #=> true 

str = "Now (is(the)time)to(have)fun)((fun)" 
pstr = str.gsub(/[^()]/,"") 
    #=> "(())())(()" 
pstr.gsub!("()", "") 
    #=> "())(" 
pstr.gsub!("()", "") 
    #=> ")(" 
pstr.gsub!("()", "") 
    #=> nil 
pstr.empty? 
    #=> false 
-1

你有沒有考慮過使用正則表達式? 類似於:

/hay/ =~ 'haystack' #=> 0 
/y/.match('haystack') #=> #<MatchData "y"> 

可能工作。

+0

剛剛嘗試過,實際上。如果我不考慮其他字符(例如'/ \(\)/。match(str)'),它會給我「()」,但如果我喜歡我上面顯示的內容,我仍然會得到「(hi)( )」。感謝壽 –

0

你接近你想要的。這裏是如果我理解正確你的問題我會使用正則表達式:

(\(.*?\)) 

\(  // match the left bracket 
.*?  // match any character as FEW times as possible (lazy use of * because of the ?) 
\)  // match the right bracket 

Regex Demo

事實上,由於懶惰的模式,搜索給定的字符(或多個)會後立即開始在最後消耗的字符。

  • 開始在
  • X*?開始搜索之後,最後消耗字符(
  • X*+就像線(貪婪)結束搜索貪婪的量詞除了它不會回溯

@Anomie在這裏解釋:Greedy vs. Reluctant vs. Possessive Quantifiers