当前位置: 首页 > wzjs >正文

长沙手机网站建设公司排名soso搜搜

长沙手机网站建设公司排名,soso搜搜,外链建设对网站的影响,长沙做网站公这道题放在动态规划里属实是有点难为人了,感觉用动态规划来做反而更难理解了,这道题用索引栈来做相当好理解,这里先讲下索引栈的思路。 索引栈做法 我们定义一个存放整数的栈,定义一个全局变量result来记录最长有效子串的长度&a…


这道题放在动态规划里属实是有点难为人了,感觉用动态规划来做反而更难理解了,这道题用索引栈来做相当好理解,这里先讲下索引栈的思路。

索引栈做法

我们定义一个存放整数的栈,定义一个全局变量result来记录最长有效子串的长度,然后我们通过下标来遍历整个字符串s,当我们遇到(时,就将其索引压入栈中,当我们遇到)且栈顶元素对应(时,此时遇到了一对闭合的括号,我们直接将栈顶的(弹出,再用当前元素的下标i减去当前栈顶元素的下标,就能得到当前有效字串的长度,若我们遇到)但是栈顶元素不是(时,说明还没匹配上,直接将当前元素的下标压入栈中。值得注意的是,当我们遇到一对匹配的括号,并将栈顶元素弹出后,如果此时栈为空,则说明从开头到现在的元素组成的子串都是有效合法的,这里为什么不能计算当前元素与栈顶元素下标之差?因为我们无法保证当前的栈是第一次被清空,如果是第一次被清空,则可以这么做,但如果是第4次被清空,直接用元素与栈顶元素下标之差得到的是第4小段合法子串的长度,正确的结果应当是4小段拼接起来的长度,因此这里要直接使用当前元素的下标+1来计算结果。

class Solution {
public:int longestValidParentheses(string s) {stack<int> st;  //索引栈int result = 0;for(int i = 0; i < s.size(); i++){if(!st.empty() && s[st.top()] == '(' && s[i] == ')'){  //遇到一对匹配的括号st.pop();   //将匹配上的'('弹出if(st.empty())   //若栈清空了,则说明从s[0]到当前位置所组成的字符串是格式正确且连续的result = max(result, i + 1);else result = max(result, i - st.top());  //若栈还没清空,则说明只是局部匹配,仅记录最外层左右括号之间的索引之差}else st.push(i);}return result;}
};

动态规划做法

感觉动态规划在状态转移的时候晦涩难懂,感觉自己想根本想不到,我是参考了一下这个大佬的题解才慢慢想明白的。建议先去看一下他的题解。接下来我们开始动规五部曲。
1.确定dp[i]的含义:以下标为i的元素结尾的情况下所能取到的最长有效子串的长度
2.确定递推公式
(1)当s[i] == '('时,dp[i] = 0;
(2)当s[i] == ')'且s[i - 1] == '('时,dp[i] = i >= 2 ? dp[i - 2] + 2 : 2;
(3)当s[i] == ')'但s[i - 1] == ‘)‘时,先判断s[i - dp[i - 1] -1]是否为’(’
如果是,当i - dp[i - 1] - 2 >= 0时,则dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]
否则dp[i] = dp[i - 1] + 2;
3.dp数组初始化 dp[0] = 0;
4.确定遍历顺序:从左往右遍历
5.打印数组(省略)
这里重点解释下递归公式。

  1. 当我们以(结尾时,无论前面的字符串是否闭合,这个字符串一定闭合不了,所以dp[i]赋值为0毫无疑问。
  2. 当我们以)结尾时,如果上一个字符为(,则我们遇到了形如......()的情况,我们先判断(前是否还有字符,如果有,则dp[i] = dp[i - 2] + 2;,如果没有,则dp[i] = 2,这也很好理解。
  3. 当我们以)结尾时,如果上一个字符为),则我们遇到了形如......))的情况,倘若dp[i-1]的有效序列的前一个是((即s[i - dp[i - 1] -1] == '('),这样才能够和当前)配对(言下之意就是上一个)必须闭合,当前的)才能闭合),由于在这种...((...))情况下dp[i - 1]一定会小于dp[i],我们还需要考虑与当前括号匹配的前面是否还有字符,若还有字符,则dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];,否则dp[i] = dp[i - 1] + 2;
    感觉第三种情况特别难想,好烧脑。。。
class Solution {
public:int longestValidParentheses(string s) {//1.确定dp[i]的含义:以下标为i的元素结尾的情况下所能取到的最长有效子串的长度//2.确定递推公式  //(1)当s[i] == '('时,dp[i] = 0;//(2)当s[i] == ')'且s[i - 1] == '('时,dp[i] = dp[i - 2] + 2;//(3)当s[i] == ')'但s[i - 1] == ')'时,先判断s[i - dp[i - 1] -1]是否为'('//如果是,当i - dp[i - 1] - 2 >= 0时,则dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]//否则dp[i] = dp[i - 1] + 2;//3.dp数组初始化 dp[0] = 0;//4.确定遍历顺序:从左往右遍历//5.打印数组(省略)int result = 0;vector<int> dp(s.size(), 0);for(int i = 1; i < s.size(); i++){if(s[i] == '(')  //以'('结尾一定闭合不了dp[i] = 0;else if(s[i] == ')'){if(s[i - 1] == '(')  //遇到一对'(' ')',括号闭合dp[i] = i >= 2 ? dp[i - 2] + 2 : 2;else{   //遇到')'')'if(i - dp[i - 1] > 0 && s[i - dp[i - 1] -1] == '('){  //遇到"((.....))"if(i - dp[i - 1] - 2 >= 0)dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];else dp[i] = dp[i - 1] + 2;}}}result = max(dp[i], result);}return result;}
};
http://www.dtcms.com/wzjs/420281.html

相关文章:

  • 网站vip功能怎么实现俄罗斯搜索引擎yandex推广入口
  • 网站手机版二维码怎么做软件培训
  • wordpress 邮件 gmail广州seo全网营销
  • 南昌比较好的网站设计常用的五种网络营销工具
  • 平台网站建设设计百度指数查询工具
  • 有永久免费的域名吗知乎seo门户网价格是多少钱
  • 国内免费建站网站哈尔滨seo网站管理
  • 门户网站建设教程百度推广如何计费
  • 怎么在搜狐快站上做网站爱链
  • 百度竞价推广优势网站seo优化服务
  • 抖音代运营多少钱一个月google搜索排名优化
  • 台州网站建设系统社群营销成功案例
  • 外汇直播室都是网站做免费注册网页网址
  • 网站开发环境写什么淄博头条新闻今天
  • 多少企业需要网站建设百度登录首页
  • 人物摄影网站免费的短视频app大全
  • 哈尔滨网站搜索优化公司百度百家号注册
  • 成都哪家公司做网站seo网站推广软件
  • 珠海横琴建设局网站学校招生网络营销方案
  • 石家庄网站建设推广公司电话百度竞价推广开户价格
  • 历史文化类网站源码三只松鼠营销案例分析
  • 快速网站建设多少钱app营销策略都有哪些
  • 系统网站建设百度关键词排名推广
  • 施工企业质量管理体系应按照我国旺道网站排名优化
  • 山东潍坊疫情最新情况网店seo是什么意思
  • 单位做网站的目的自己做seo网站推广
  • 做网站需要准备的东西自己开网站怎么开
  • 买了两台服务器可以做网站吗重庆seo服务
  • 中国免费建站网网站网页的优化方法
  • 郑州汉狮专业做网站公司合肥网站推广优化