interleave字串;及括號匹配分析
今日面試題:interleave字串
3個字串a,b,c。判斷c是否是a和b的interleave,也就是c中應該有a,b中所有字 符,並且c中字元順序和a,b中一樣。比如,a = "ef" b = "gh" c = "egfh" return true;a = "ef" b = "gh" c = "ehgf" return false。
===========================================================
括號匹配分析
原題
給定字串,輸出括號是否匹配,例如,
1. "()" yes;
2. ")(" no;
3. "(abcd(e)" no;
4. "(a)(b)" yes。
要求必須用遞迴寫,整個實現不可以出現一個迴圈語句。
分析
這個題目很多同學都見過了,如果沒有後面的條件,會張口就說就來用棧來實現,時間複雜度O(n),空間複雜度O(n)。這個是很好的一個解答,沒有 問題的。但是我們在做面試題,準備面試的過程中,每一個題目都不應該僅僅侷限於某一個方法。應該嘗試更多的思路,儘管有些思路的時間、空間複雜度並不是很 好,但是可以帶來變化,舉一反三,這才是真正的收穫。
這個題要求了,只目能使用遞迴併且不能出現迴圈語句。這個時候,我們應該如何處理呢?其實告訴了大家遞迴,就比較好想了:怎麼定義好問題和子問題。
如果字串中的括號是匹配的,則'('的數量和')'的數量是相等的,反之是不相等的。這樣,在遞迴的過程中,可以儲存一個變數,用來記錄'('的 數量和')'的數量是否匹配。這樣定義遞迴問題f(p,count),表示當前字元p之前的字串中'('的數量和')'的數量的匹配情況,p表示指向當 前字元的指標。初始的時候,f(p, 0),遞迴的過程如下:
1. 如果p為空,則考察count是否為0,如果為0,則匹配;如果不為0,則不匹配;
2. 如果不為空,則考察當前字元p,如果p='(',則遞迴呼叫f(p++, count++);如果p=')',則遞迴呼叫f(p++, count--)。如果p是其他的字元,並不是'('和')',則遞迴呼叫f(p++, count),count不變,繼續考慮下一次字元。其中需要檢查和保證count>=0.
其實,遞迴的問題有的時候不是那麼好像的,需要大家不斷的練習。如果不採用count來記錄括號匹配的情況,這個題目的遞迴也不好想。
【分析完畢】
本文來自微信:待字閨中,2013-09-16釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 括號匹配;及找數字續分析
- 刪除字元;及interleave字串分析字元字串
- 【棧】括號匹配
- HDU 5831 Rikka with Parenthesis II (括號匹配)
- 資料結構括號匹配問題資料結構
- [PHP字串]②--花括號{}的作用PHP字串
- LeetCode 3: PairsOfParentheses (括號匹配問題)LeetCodeAI
- 括號匹配的檢驗問題(C++)C++
- POJ 2955-Brackets(括號匹配-區間DP)Racket
- 演算法篇-字串-TeX括號演算法字串
- JSON 字串中的中括號和大括號區別詳解JSON字串
- 括號匹配檢驗 資料結構運用資料結構
- UVA 673 括號的匹配——經典棧的應用
- 演算法題:判斷括號字串是否有效演算法字串
- JavaScript取出字串中括號裡的內容JavaScript字串
- 理解正規表示式中的括號 (),方括號 [] 和大括號 {}
- 【資料結構】棧的應用--括號的匹配(c++)資料結構C++
- Python有效括號字串判斷和深度計算Python字串
- 括號畫家
- 詳解中括號語法及點語法
- 字串匹配字串匹配
- {{rateTime}}大括號裡面的數字轉換為字串(日期)字串
- c++物件建立帶括號與無括號的區別C++物件
- JavaScript中圓括號()和方括號[]的一個特殊用法JavaScript
- js正規表示式獲取字串中多個大括號{}中的內容,包括大括號並放入陣列中JS字串陣列
- Shell 括號總結
- Swift之花括號Swift
- 最長有效括號
- 【題解】括號序列
- C# 正規表示式提取字串中括號裡的值C#字串
- 【字串匹配】KMP字串匹配KMP
- 正則中括號點符號符號
- JavaScript 函式呼叫時帶括號和不帶括號的區別JavaScript函式
- Matlab中的括號()[]{}Matlab
- 每日一題: 有效括號每日一題
- 20. 有效的括號
- 字串匹配問題字串匹配
- py匹配字串中間的字串字串