括号字符串的有效性和最长有效长度
題目
給定一個(gè)字符串str,判斷是不是整體有效的括號(hào)字符串。例如,str = “()()()”,返回True,str = “())” 或 “()a()”,返回False。
補(bǔ)充題目
給定一個(gè)括號(hào)字符串,返回最長(zhǎng)的有效字符串的長(zhǎng)度。
?
基本思路
原問題。判斷過程如下:
從左到右遍歷str,判斷每一個(gè)字符是否是括號(hào),如果不是,直接返回False。
遍歷過程中,檢查目前位置 ‘(‘和 ‘)’的數(shù)量,如果 ‘)’的數(shù)量多,直接返回False。
遍歷結(jié)束后,檢查 ‘(‘和 ‘)’的數(shù)量是否相同,如果一樣多返回True,否則返回False。
補(bǔ)充問題。使用動(dòng)態(tài)規(guī)劃,類似于最長(zhǎng)遞增子序列問題。假設(shè)str的長(zhǎng)度為N,生成長(zhǎng)度為N的dp數(shù)組,dp[i]的含義是必須以str[i]結(jié)尾的最長(zhǎng)有效括號(hào)長(zhǎng)度子串。dp的求解如下:
dp[0],表示只含有一個(gè)括號(hào),dp[0] = 0。
如果dp[i] == ‘(‘,肯定不能作為末尾,dp[i] = 0。
如果dp[i] == ‘)’,dp[i-1]的含義是以str[i-1]結(jié)尾的最長(zhǎng)有效子串長(zhǎng)度,如果 i - dp[i-1] - 1位置上的字符是 ‘(‘,則可以與dp[i]湊成一對(duì),則此時(shí)dp[i]最小等于dp[i-1] + 2。此外,如果 i - dp[i-1] - 1位置上的字符變成了有效字符,那么以該位置的前一個(gè)位置 i - dp[i-1] - 2的最長(zhǎng)有效長(zhǎng)度也應(yīng)該加進(jìn)來,所以dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2]。
dp[0…N-1]中最大的值就是最長(zhǎng)的有效字符串的長(zhǎng)度。
?
?
總結(jié)
以上是生活随笔為你收集整理的括号字符串的有效性和最长有效长度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回文最少分割数
- 下一篇: 不用额外变量交换两个整数的值