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。解題思路 檢驗括號是否是匹配的方法可以用 期待的急迫程度 這個概念來描述。例如考慮...