括號匹配問題

2021-07-29 21:15:17 字數 3119 閱讀 2393

1.題目:

給定字串,輸出括號是否匹配,例如,

"()" yes;

")(" no;

"(abcd(e)" no;

"(a)(b)" yes。

要求必須用遞迴寫,整個實現不可以出現乙個迴圈語句。

2.思路:利用棧解題是可以,但也可以遞迴完成

字母p之前的匹配狀況數用count表示(即count表示p之前左括號的個數),f(p,count)

如果當前字元p是 左括號(  那麼f(p++,count++)

如果當前字元p是右括號) 那麼f(p++,count--)

如果當前字元其他字元  那麼f(p++,count)

要注意:當s==null且count==0時,說明匹配成功

如果count<0說明在p之前,出現右括號多出的情況,那麼直接不匹配

public class main 

public static void main(string args)

}}

3.()的匹配,請問至少新增多少個括號才能使這些括號匹配起來。

(1)利用棧:來個左括號入棧,如果來個右括號且能匹配 彈出棧,否則入棧。因為(})兩個括號之間有乙個括號的話,那麼就不匹配了

(2)動態規劃 d[i][j]表示位置 i->j要新增的括號數,那麼對於 j+1的位置,d[i][i]=1

情況1,前面沒有與他配合的左括號。此時把 j+1單出來,或者把 i單出來 d[i][j+1]=min( d[i][j]+1, d[i+1][j]+1)

情況2,i->j有與 j+1相匹配的括號k, 如[()當 d[1][2]=0, 而不是min( d[2][2]+1 ,d[1][1]+1)。這種情況下位置k和j+1括號匹配,而括號序列分成兩個部分 i->k-1   k+1->j  所以此時d[i][j+1]= min(d[i][j]+1  ,  d[i+1][j+1]+1,  (d[i][k-1]+d[k+1][j]) )

public static  boolean ispair(char a,char b)'))  return true;

return false;

} /**

* * @title: insert

* @description: 如果要匹配括號序列,至少要插入幾個括號

* @param @param s 動態規劃思想 d[i][j]表示從i到j匹配的話要插入多少個字元

* @param @param len

* @throws

*/public static int insert(string s,int len)

} for(int j=2;j<=len;j++)){}最左側left和最右側right,如果匹配,那麼指標向中間移動,如果不匹配,那麼從left+1到right-1開始尋找k,遞迴進行匹配

private static int dp;

private static string str;

public static void init(string s,int len)

for(int k=left;k4、輸入括號個數,輸出括號的各種匹配樣式  如2 ,()()  和(())。為了避免不合法的()())情況,右括號的數目一定不能大於左括號。動態規劃問題:這個相當於0-1揹包,當進行第j步的時候,是放(還是)

首先left<=sum 遞迴新增左括號,如sum=3,那麼matching左括號遞迴之後list中存的是(((,不太明白遞迴後為啥要彈出左括號,list.remove(list.size()-1)

private static list list=new arraylist();

public static void matching(int left,int right,int sum)

system.out.println();

return;

} if(left<=sum)

if(left>right&&left<=sum)

}

2

( ( ) )

( ) ( )

3( ( ( ) ) )

( ( ) ( ) )

( ( ) ) ( )

( ) ( ( ) )

( ) ( ) ( )

left=0	right=0	[(]

left=1 right=0 [(, (]

left=2 right=0 [(, (, (]

[(, (, (]

left remove: left=2 right=0 [(, (]

left=2 right=0 [(, (, )]

left=2 right=1 [(, (, ), (]

[(, (, ), (]

left remove: left=2 right=1 [(, (, )]

left=2 right=1 [(, (, ), )]

( ( ) )

[(, (, ), )]

right remove: left=2 right=1[(, (, )]

[(, (, )]

right remove: left=2 right=0[(, (]

[(, (]

left remove: left=1 right=0 [(]

left=1 right=0 [(, )]

left=1 right=1 [(, ), (]

left=2 right=1 [(, ), (, (]

[(, ), (, (]

left remove: left=2 right=1 [(, ), (]

left=2 right=1 [(, ), (, )]

( ) ( )

[(, ), (, )]

right remove: left=2 right=1[(, ), (]

[(, ), (]

left remove: left=1 right=1 [(, )]

[(, )]

right remove: left=1 right=0[(]

[(]left remove: left=0 right=0

括號匹配問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes 基本演算法思...

括號匹配問題

假設表示式中包含三種括號 圓括號 方括號和花括號,它們可以相互巢狀,如 等均為正確的格式,而等為不正確的格式。以下為演算法程式 括號匹配問題 include include int main char ch while ch getchar eof count 0 break case if cou...

括號匹配問題

問題描述 假設表示式中允許包含兩種括號 圓括號與方括號,其巢狀的順序隨意。如 或 等為正確的匹配 而 或者 或者 均為錯誤的匹配。現要求編寫程式,判斷輸入的一行括號是否是匹配的,如果是匹配的,輸出yes,否則輸出no。解題思路 檢驗括號是否是匹配的方法可以用 期待的急迫程度 這個概念來描述。例如考慮...