最小括號匹配演算法(2013小公尺筆試)

2021-06-09 20:09:16 字數 1396 閱讀 4548

二維陣列引數傳遞

// 2013小公尺筆試之最小括號匹配.cpp : 定義控制台應用程式的入口點。

///*

動態規劃思想:dp[i][j]表示第i到j的需要的最少括號數 在計算dp[i][j]時,若已知dp[i][j-1],此時dp[i][j]有兩種可能:

1 是str【j】和前j-1個都不匹配,此時dp[i][j] = dp[i][j-1] + 1;

2 是str【j】和前j-1中的某乙個匹配,假設第k個(i<=k<=j-1),此時dp[i][j] = dp[i][k-1] + dp[k+1][j-1],為什麼這樣呢?因為第k個和第j個匹配呀,就可以都直接去掉了。

初始化條件:dp[i][i]=1;dp[i][i-1]=0;

最後要求的是 dp[0][n-1]

考慮上面的邊界情況:當k==i時,因為i從0開始,所以後面k-1可能陣列越界;或者k==j-1==n-1,k+1也會越界,所以特殊處理。

實際此題用dp[n+2][n+1]時,多用了邊界的儲存空間,程式更明了。

*/#include "stdafx.h"

#include#include#includeusing namespace std;

#define n 8

//void print(int str[n][n])//二維陣列引數傳遞,void print(int str[n]) void print(int (*str)[n]) 這三種形式都是等同的

void print(int str[n])//

//void print(int (*str)[n])//z這種形式必須加(),否則變成了指標陣列了,和指向陣列的指標 是不一樣的。二維陣列的表示最關鍵的是要知道每一行的長度(即指向陣列的指標要知道陣列的長度),即第二個n

for(i=1;i<=s.length();i++)

for(j=1;j<=s.length()-i;j++)

for(i = 2; i <= s.length(); ++i)}}

} cout << dp[1][s.length()] << endl;

} return 0;}*/

/*#includeusing namespace std;

#define n 10

#define inf 1e9

int d[n][n];

int pos[n][n];

char s[n]; //接受初始資料

void match(int len)

}}void show(int i,int j)

"; }

else

{ if(pos[i][j]==-1)

{ cout<>s;

int len=strlen(s);

match(len);

for(int i=0;i

不用棧檢查小括號 中括號 大括號的匹配

設定三個計數器初值設為零,分別記錄小括號 中括號 大括號。開始進行第一次掃瞄,從左向右依次掃瞄每個字元,遇到左括號計數器加一,遇到右括號計數器減一,出現計數器小於零時,報錯退出。掃瞄結束後,若三個計數器有乙個不為零說明括號不匹配,報錯結束檢查。第一步掃瞄結束,如果正確說明三種括號本身匹配正確。現在可...

括號匹配演算法

檢驗括號是否匹配的方法可以用 期待的急迫程度 這個概念來描述。例如,考慮下列括號序列 1 2 3 4 5 6 7 8 當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號 只能暫時靠邊,而迫切等待與第二個括號相匹配的 第七個括號 的出現,類似地,因...

括號匹配演算法

題目 有一段字串,包含 和 和 中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫 判斷三種括號是否正確匹配。思路一 棧的思想 括號匹配是運用棧的經典思想。在 演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,若是右括號,能使置於棧頂的最急迫的期待得以消解...