小white刷题记——LeetCodeHot100_32

LeetCodeHot_32——《最长有效括号》

 

解题思路:这道题一看就是动态规划的解题的方法了,按照动态规划五部曲来做的话:

①确定dp数组(dp table)以及下标的含义:

       dp[i] → 第i个元素表示下标为i的字符结尾的最长有效子字符串的长度。

②确定递推公式:

        看第 i 个元素:

        1° s[i] = ' ( '   第 i 个元素为左括号的时候,这个元素没办法和之前的任意一个元素组成有效括                               号对的,所以此时dp[i]=0。

        2° s[i] = ' ) '   第 i 个元素为右括号的时候,此时就需要看s[i-1]了,这个前一个位置的括号也是有两种情况的:

                1)s[i-1]=' ( ' ,第i个元素前一个元素是左括号,这样的话第 i-1 个元素和第 i 个元素是可以组成有效括号对的,所以这时就可以在所求长度上 +2 。所以此时 dp[i] = dp[i-2]+2;

                2)s[i-1]=' ) ',第i个元素前一个元素是右括号,这样第 i-1 和第 i 个元素是无法组成有效括号对的,但是此时s[i-1]和s[i]的组成形式是" ) ) ",所以如果s[i]能组成有效括号对的前提就是s[i-1]已经和别人组成过了,否则,s[i-1]是在s[i]前边的,组成也是s[i-1]先组成。所以我们只需要找到和s[i]配对的括号对的位置:i-dp[i-1]-1(这里的理解其实就是,先看dp[i-1],代表的是下标为 i-1 的字符的括号对的长度,i-dp[i-1] 的意思就是和 i-1 位置的括号匹配的那个左括号,i-dp[i-1]-1 就是和这个右括号的匹配的左括号了)。

                如果:此时的s[i-dp[i-1]-1] = ' ( ',那么总长度就要加2,结果就是dp[i] = dp[i-1]+2,但是这里实际上的意思是s[i]与s[i-1]都各自有一对括号对——" ( ( ) ) ",所以还要加上之前的长度,也就是dp[i] = dp[i-1]+dp[ i-dp[i-1]-2 ]+2

                 所以:递推公式就可以确定了:

\begin{cases} dp[i]=dp[i-2]+2& \text{ if } \ s[i]=='\ )\ '\ and\ s[i-1]=='\ (\ ' \\ dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2& \text{ if } \ s[i]=='\ )\ '\ and\ s[i-1]=='\ )\ ' \end{cases}

③dp数组如何初始化:

        初始化dp[i] = 0;

        dp[0]=0,dp[1]=0;

④确定遍历顺序

        所以这里遍历只需要遍历字符串 s 就可以了、

⑤举例推导dp数组

 具体代码:

int longestValidParentheses(string s) {
	    int size = s.length();
	    vector<int> dp(size, 0);//定义一个含有size个元素的数组,每个值都是0;
	    int maxNum = 0;//定义最后返回的长度最大值
	    for (int i = 1; i < size; i++)
	    {
		    if (s[i] == ')')
		    {
			    if (s[i - 1] == '(')
			    {
			    	dp[i] = 2;
			    	if (i - 2 >= 0)
				    {
				    	dp[i] = dp[i] + dp[i - 2];
			    	}
			    }
			    else if (dp[i - 1] > 0)
			    {
				    if ((i - dp[i - 1] - 1) >= 0 && s[i - dp[i - 1] - 1] == '(')
				    {
				    	dp[i] = dp[i - 1] + 2;
					    if ((i - dp[i - 1] - 2) >= 0)
					    {
						    dp[i] = dp[i] + dp[i - dp[i - 1] - 2];
					    }
				    }
			    }
		    }
		    maxNum = max(maxNum, dp[i]);
	    }
	    return maxNum;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“ # 设置按钮的背景颜色 self.m_button1.SetBackgroundColour('#0a74f7') self.m_button1.SetForegroundColour('white') self.m_button2.SetBackgroundColour('#0a74f7') self.m_button2.SetForegroundColour('white') self.m_button3.SetBackgroundColour('#0a74f7') self.m_button3.SetForegroundColour('white') self.m_button4.SetBackgroundColour('#238E23') self.m_button4.SetForegroundColour('white') self.m_button5.SetBackgroundColour('#238E23') self.m_button5.SetForegroundColour('white') self.m_button6.SetBackgroundColour('#238E23') self.m_button6.SetForegroundColour('white') self.m_button7.SetBackgroundColour('#6F4242') self.m_button7.SetForegroundColour('white') self.m_button8.SetBackgroundColour('#6F4242') self.m_button8.SetForegroundColour('white') self.m_button9.SetBackgroundColour('#6F4242') self.m_button9.SetForegroundColour('white') self.m_button10.SetBackgroundColour('#8E6B23') self.m_button10.SetForegroundColour('white') self.m_button11.SetBackgroundColour('#8E6B23') self.m_button11.SetForegroundColour('white') self.m_button12.SetBackgroundColour('#8E6B23') self.m_button12.SetForegroundColour('white') self.m_button13.SetBackgroundColour('#8E6B23') self.m_button13.SetForegroundColour('white') self.m_button14.SetBackgroundColour('#545454') self.m_button14.SetForegroundColour('white') self.m_button15.SetBackgroundColour('#545454') self.m_button15.SetForegroundColour('white') self.m_button16.SetBackgroundColour('#545454') self.m_button16.SetForegroundColour('white') self.m_panel1.SetBackgroundColour('white') # 设置面板的背景颜色”逐行解释代码
06-07
这段代码是用来设置图形用户界面中多个按钮和一个面板的背景和前景颜色的。具体解释如下: - `self.m_button1.SetBackgroundColour('#0a74f7')`:设置按钮1的背景颜色为蓝色。 - `self.m_button1.SetForegroundColour('white')`:设置按钮1的前景颜色为白色。 - `self.m_button2.SetBackgroundColour('#0a74f7')`:设置按钮2的背景颜色为蓝色。 - `self.m_button2.SetForegroundColour('white')`:设置按钮2的前景颜色为白色。 - `self.m_button3.SetBackgroundColour('#0a74f7')`:设置按钮3的背景颜色为蓝色。 - `self.m_button3.SetForegroundColour('white')`:设置按钮3的前景颜色为白色。 - `self.m_button4.SetBackgroundColour('#238E23')`:设置按钮4的背景颜色为绿色。 - `self.m_button4.SetForegroundColour('white')`:设置按钮4的前景颜色为白色。 - `self.m_button5.SetBackgroundColour('#238E23')`:设置按钮5的背景颜色为绿色。 - `self.m_button5.SetForegroundColour('white')`:设置按钮5的前景颜色为白色。 - `self.m_button6.SetBackgroundColour('#238E23')`:设置按钮6的背景颜色为绿色。 - `self.m_button6.SetForegroundColour('white')`:设置按钮6的前景颜色为白色。 - `self.m_button7.SetBackgroundColour('#6F4242')`:设置按钮7的背景颜色为红色。 - `self.m_button7.SetForegroundColour('white')`:设置按钮7的前景颜色为白色。 - `self.m_button8.SetBackgroundColour('#6F4242')`:设置按钮8的背景颜色为红色。 - `self.m_button8.SetForegroundColour('white')`:设置按钮8的前景颜色为白色。 - `self.m_button9.SetBackgroundColour('#6F4242')`:设置按钮9的背景颜色为红色。 - `self.m_button9.SetForegroundColour('white')`:设置按钮9的前景颜色为白色。 - `self.m_button10.SetBackgroundColour('#8E6B23')`:设置按钮10的背景颜色为橙色。 - `self.m_button10.SetForegroundColour('white')`:设置按钮10的前景颜色为白色。 - `self.m_button11.SetBackgroundColour('#8E6B23')`:设置按钮11的背景颜色为橙色。 - `self.m_button11.SetForegroundColour('white')`:设置按钮11的前景颜色为白色。 - `self.m_button12.SetBackgroundColour('#8E6B23')`:设置按钮12的背景颜色为橙色。 - `self.m_button12.SetForegroundColour('white')`:设置按钮12的前景颜色为白色。 - `self.m_button13.SetBackgroundColour('#8E6B23')`:设置按钮13的背景颜色为橙色。 - `self.m_button13.SetForegroundColour('white')`:设置按钮13的前景颜色为白色。 - `self.m_button14.SetBackgroundColour('#545454')`:设置按钮14的背景颜色为灰色。 - `self.m_button14.SetForegroundColour('white')`:设置按钮14的前景颜色为白色。 - `self.m_button15.SetBackgroundColour('#545454')`:设置按钮15的背景颜色为灰色。 - `self.m_button15.SetForegroundColour('white')`:设置按钮15的前景颜色为白色。 - `self.m_button16.SetBackgroundColour('#545454')`:设置按钮16的背景颜色为灰色。 - `self.m_button16.SetForegroundColour('white')`:设置按钮16的前景颜色为白色。 - `self.m_panel1.SetBackgroundColour('white')`:设置面板1的背景颜色为白色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值