括號匹配(二)

2021-06-18 01:37:51 字數 1354 閱讀 4887

題目:

/*

問題:給你乙個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。

如:是匹配的,所需括號個數為 0.

()是匹配的, 所需括號個數為 0.

((]是不匹配的, 所需最少括號個數為 3.

([)]是不匹配的,所需最少括號個數為 2.

分析:此題來自: 作者同時給出了正確答案。但是,感覺答案還不是特別的詳細,也不是特別容易懂。所以,在此寫下自己的分析思路。

1. 我們用 mb[i][j] 表示從位置 i 到字元位置 j 所需的最少括號數。假定字串是 「[ ( )」, 那麼 mb[0][0] = mb[1][1] = mb[2][2] = 1。

2. 如果我們要算mb[i][j+1], 那麼,最壞的情況是使得沒有被匹配的括號數增加了,即 mb[i][j+1] 最多為 min( mb[i][j] + 1, mb[i+1][j+1] + 1). 但是,這可能不是我們想要的答案,因為在剛才的例子裡,即:假定字串是 「[ ( )」, 那麼 mb[0][1] = mb[0][0] + 1= 2, 但是 mb[1][2] 卻不等於 mb[1][1] + 1.

3. 那麼,什麼情況下mb[i][j+1] = mb[i][j] + 1?只有當 字串裡從i 到 j 沒有任何字元與第 j + 1 個字元匹配的時候。但是,如果存在和第 j + 1 個字元匹配的情況,問題就不一樣了。

4. 假設在i 到 j 之間存在乙個字元(比如在位置 k)與第 j + 1 個字元匹配,那麼我們相當於把原來的字串分成了兩個部分mb[i][k-1] 和 mb[k+1][j], 因為第k 個 和 j + 1 個字元已經匹配掉了。而且,我們不會再考慮 i 到 k - 1 的字元會和 k + 1 到 j 之間的字元匹配的情況,因為我們已經把這兩個部分完全分開了(很重要的一點,這也是我當時思考很久的地方)。話句話說 mb[i][j+1] = min(min( mb[i][j] + 1, mb[i+1][j+1] + 1), mb[i][k-1] + mb[k+1][j]).

有了這樣的分析,我們可以利用動態規劃的思路來解決這樣的問題。**如下:

思路來自:

自己又寫了一遍。

*/#include #include #include using namespace std;

const int dpsize=105;

int dp[dpsize][dpsize];

bool ismatch(const char& s1,const char &s2)

return false;

}void sulotion(const string &str)

return 0;

}

括號匹配(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...

括號匹配(二)

演算法 動態規劃 描述給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過10...

括號匹配(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...