簡單括號匹配問題是給出字串,判斷字串中的括號是否匹配,此類問題核心解決方案就是利用棧的後進先出的特性,從左到右依次遍歷字串,遇左括號進棧,遇右括號將其與棧頂元素配對,若能配對,則棧頂元素出棧,繼續遍歷,若不能配對,則返回false。字串遍歷結束後,判斷棧是否為空,若不為空返回false,若為空,返回true。以下有c和c++實現**,用c++可以利用標準庫提供的順序容器介面卡stack來實現棧結構,c語言則需要自己寫棧結構,當然也可以用陣列模擬棧結構,用一變數存放陣列中最後面的元素的下標代表棧頂指標進行入棧出棧就可以了。
c語言版 題目來自
1/*2c語言實現現在有一行括號序列,請你檢查這行括號是否配對3輸入
4第一行輸入乙個數n(05
每組輸入資料都是乙個字串s(s的長度小於10000,且s不是空串),測試資料組數少於5組。
6資料保證s中只含有"[", "]", "(", ")" 四種字元7輸出
8每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no
9實現:
10棧模型實現
11*/
12 #include13 #include14 #include15
16 typedef struct node *pnode;
1718
struct
node
19node;
2324 typedef struct
stack
25stack,*pstack;
2930
/*建立空棧
*/31
void
initstack(pstack ps)
3237
38/*
進行壓棧
*/39
void pushstack(pstack ps,char
str)
4046
/*進行出棧
*/47
char
popstack(pstack ps)
4856
/*判斷棧是否為空
*/57
bool
empty(pstack ps)
5864
65/*
掃瞄字串
*/66
bool scanner(char *pstr)
6788 ret = (popstack(&s) == '('
);89
if(ret == false)90
93break;94
case']
':95if(empty(&s))
9699 ret = (popstack(&s) == '['
);100
if(ret == false
)101
104break
;105
}106 i++;
107}
108if(empty(&s) == false) //
如果掃瞄完字串棧不是空的
109112
return
ret;
113114
}115
116int main(void
)117
130else
131134
}135
136return0;
137 }
c++版 題目來自
1c++實現/*括號配對
*/2 #include3 #include4 #include
5using
namespace
std;
6int main(void)7
32char tch =my_stack.top();
33if(t == '
>
' && tch != '
<
' ||
34 t == '
}' && tch != '
41my_stack.pop();42}
43}44if
(k)50}51
52return0;
53 }
此類問題給出一串由'(' ')' '[' ']' 四種字元組成的字串,要求在字串中新增若干個括號,使整個字串達到匹配狀態,這類問題屬於區間動態規劃問題,試想,題目要求的是整個字串匹配的時候的最小的新增的括號的個數,我們定義兩個指標變數i,j 分別指向字串的頭和尾,如果s[i]和s[j]匹配,那整個問題的解就是除了s[i]和s[j]後的子串s[i+1]到s[j-1]的解(**第33行),而子串的解又由更小的字串的解來確定,所以可以知道,此問題採用自底而上的解法,亦或者說成自小而大的解法。上面的過程也可稱為問題的狀態轉移過程,在考慮完狀態轉移過程後還必須考慮邊界問題,狀態轉移是由小串到大串,所以從右至左或從左至右都可以,但是要考慮邊界問題,此問題中,邊界問題就是只有乙個字元的字串和空串,用i和j代表一前一後兩個字元,那麼只有乙個字元時也就是i和j相等時候,此時,dp[i][j],也就是dp[i][i]為1,當字串為空串時,也是i>j時候 此時 dp[i][j]為0 也可作dp[i+1][i]為0.由此想來,得是從右至左處理字串方便。在程式中,需要將每個子串的最優解存起來,所以有陣列dp[i][j]儲存 從i到j的這個字串的最優解是多少。
題目自
#includeusing**實現namespace
std;
int d[101][101
];bool match(char a, char
b) int main(void
) memset(d,
0,sizeof
(d));
for(int i = 0; i < len; ++i)
for( int i = len -2; i >= 0; --i ) }}
cout
<< d[0][len-1] <
}return0;
}
動態規劃作為一種解決問題的思想,其主要手段就是儲存子問題的最優解來匯出整個問題的最優解,那麼需要考慮的就是最小的子問題如果處置,也就是邊界問題,還有就是子問題如何向整個問題邁進或者整個問題如何分成子問題來求解,如何利用子問題的解,和選擇最優解,也就是狀態轉移問題。
長袍紙扇山羊須,冷盤花生小酒,豈不美哉!
區間DP 括號匹配問題
區間dp問題 區間dp主要是通過左邊界和右邊界來確定狀態轉移方程,在極大值或極小值問題中,通過區間短對區間長的推導或者區間長對區間短的推導,就可以找出區間長的極值化問題。這次學習的過程中主要是有字首和思想,就是用乙個一位陣列來存放從 0,i 這個區間的值的和,若要知道一段區間的值的和,只需要將 0,...
最長匹配括號子串行問題
給定乙個字串只包含 和 輸出其中最長的括號正確匹配的子串行的長度。輸入輸出 2 4 2 8以下將介紹三種複雜度為o n 的演算法 該演算法利用了棧來遍歷可能的匹配的括號子串行,遍歷的同時找出最長的子串行。遍歷不會遍歷所有的匹配括號子串行,併排的一些括號只有包含最左邊括號的子串行被遍歷,最長的括號子串...
3295 括號序列 (序列DP)
描述 給定一串字串,只由 四個字元構成。現在讓你盡量少的新增括號,得到乙個規則的序列。例如 都是規則的序列。這幾個不是規則的,如 輸入 輸入有多組測試資料。輸入一串字串序列,長度不大於255。輸出 輸出最少新增的括號數目。樣例輸入 樣例輸出 題目 椒江校區第一屆c語言程式設計大賽 這個題是問需要新增...