3. 对某仅包含左右括号的字符串而言,若其中左括号和右括号可以正确的匹配,那么称其为均衡字符串。例?
递推式:
设dp[i][j]表示S[i...j]中的最长均衡子序列长度,则有:
当S[i]和S[j]匹配时,即S[i]='(',S[j]=')'时,有dp[i][j]=dp[i+1][j-1]+2。
当S[i]和S[j]不匹配时,即S[i]='(',S[j]='('或S[i]=')',S[j]=')'时,有dp[i][j]=max(dp[i+1][j], dp[i][j-1])。
当i=j时,有dp[i][j]=0。
最终答案为dp[0][n-1]。
分析:
对于一个均衡字符串,其左右括号的数量相等,且左括号必须在右括号的左边。因此,我们可以考虑使用动态规划来解决这个问题。设dp[i][j]表示S[i...j]中的最长均衡子序列长度,我们需要找到状态转移方程。
当S[i]和S[j]匹配时,即S[i]='(',S[j]=')'时,S[i]和S[j]可以组成一个均衡字符串,因此dp[i][j]=dp[i+1][j-1]+2。
当S[i]和S[j]不匹配时,即S[i]='(',S[j]='('或S[i]=')',S[j]=')'时,S[i]和S[j]不能组成一个均衡字符串,因此我们需要在S[i+1...j]和S[i...j-1]中找到最长的均衡子序列,即dp[i][j]=max(dp[i+1][j], dp[i][j-1])。
当i=j时,S[i]不能组成一个均衡字符串,因此dp[i][j]=0。
最终答案为dp[0][n-1],其中n为字符串S的长度。
设计原理:
动态规划是一种将复杂问题分解成更小的子问题来解决的算法。在本题中,我们将字符串S分解成更小的子问题,即S[i...j],并使用dp[i][j]来表示S[i...j]中的最长均衡子序列长度。通过状态转移方程,我们可以逐步求解出dp[0][n-1],即字符串S的最长均衡子序列长度。