LeetCode 856 递归思路详解
题目描述
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
()得 1 分。AB得A + B分,其中 A 和 B 是平衡括号字符串。(A)得2 * A分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"
输出: 1
示例 2:
输入: "(())"
输出: 2
示例 3:
输入: "()()"
输出: 2
示例 4:
输入: "(()(()))"
输出: 6
提示:
S 是平衡括号字符串,且只含有 ( 和 ) 。
2 <= S.length <= 50
2.思路过程
根据题目,我们明显知道这个题百分之一万是要使用递归的思想了,但是递归的思想需要把握一个很细粒度的问题,就是怎么判断每个递归的子问题。然后这些子问题一个一个进行迭代(入栈出栈)计算,最后解决问题,这正是递归重点,也正是难点。(听我装一会儿ACD吧,mua~)
首先,我们定义一个子串的概念:
我们从字符串(...)开始往栈里面压,当遇到对称的符号时(即stack.top()是‘(’,下一个字符是‘)’的时候),就pop出这个元素,正好栈为空的时候,我们称之为子串(...)。例如(());();((())());
这样的话,我们可以将所有的问题都转化为子串(...)的组合:
例如:
(())()是两个子串(...)(...)相加,A+B的情况。
(()(()))也是一个子串(...)。
我们可以发现一个特点:子串的第一个符号’(‘和最后一个符号‘)’永远是匹配的一对括号。
这样的话,就可以将整个问题划分为以下几个子问题:
- 判断S有几个子串(...),让这些子串的分数相加即可。
- 然后子串里面有可能又是若干个子串的相加情况,例如(()()),我们就让2*()()
明白了以上的递归的小问题之后,我们就可以进行下手写代码了,先把自己的代码运行情况晒一下,性能不是太好,毕竟自己学识短浅,只能写到这样的程度了,同时也证明一下自己不是胡编乱造。嘻嘻。

3.代码实战
两个方法:
- scoreOfParentheses(string S)用来判断一个字符串里面有几个子串。让这些子串的分数相加就可以了。
- countScore()传入的参数永远是子串(...),与前面分析一样,必须保证子串的第一个左括号和子串最后一个右括号永远是保持一对的这个特征。只有这样的话,return 2*scoreOfParentheses(S1.substr(1,S1.size()-2));这句话才可正常执行,他目的就是剥去第一个和最后一个括号,将子串里面的字符串交给scoreOfParentheses()方法来判断,子串里面是不是还有子串相加的情况。
这样两个方法相互递归。相互配合就将整个问题转化为:
子串+子串:分数相加
子串嵌套子串:2*子串
然后over!
具体还有看代码,欢迎关注,欢迎来撩!
class Solution {
public:
//该方法用于处理一个子串,也就是栈可pop为empty中的情况
int countScore(string S1)
{
if(S1.size()==2)
{
return 1;
}
else{
char ch=S1[0];//S1[0]肯定是'('
if(S1[1]==')')
{
//这是()的情况
return 1+scoreOfParentheses(S1.substr(2,S1.size()-2));
}
else{
/*”((“的情况,由于S1本身传进来的时候就是一个子串,也就是不含A+B这种情况。所以还要检查里面是不是还有各个子串相加的问题.*/
return 2*scoreOfParentheses(S1.substr(1,S1.size()-2));
}
}
}
//遍历一个字符串,看看有多少个A+B的情况,例如串(())()中(())和()就是两个子串
int scoreOfParentheses(string S) //遍历整个串,看一个串能够分成多少个子串
{
int total_score=0;
stack<char> sta1;
int i1=0;//用于记录子串的开始位置,
int i2=0;//i2用于记录子串的结束位置,i2-i1+1就只子串的长度,可以用来截取子串。
while(i2<=S.size()-1)
{
sta1.push(S[i2]);//插入的肯定是‘(’
while(!sta1.empty())//不空
{
i2++;
if(S[i2]=='(')
{
sta1.push(S[i2]);
}
else
{
int top=sta1.top();
sta1.pop();
}
}//空了之后,说明一个子串(i1<->i2)遍历完毕,记录指针i,然后将指针数据传送给countScore()进行计算子串。
total_score+=countScore(S.substr(i1,i2-i1+1));
i2++;
i1=i2;
}
return total_score;
}
};
LeetCode 856 递归思路详解的更多相关文章
- BaseAdapter自定义适配器——思路详解
BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...
- Java编程配置思路详解
Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...
- 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...
- [转]Vue项目全局配置微信分享思路详解
这篇文章给大家介绍了vue项目全局配置微信分享思路讲解,使用vue作为框架,使用vux作为ui组件库,具体内容详情大家跟随脚本之家小编一起学习吧 这个项目为移动端项目,主要用于接入公众号服务.项目采用 ...
- python编写微信公众号首图思路详解
前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式 ...
- ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...
- 【转】ANDROID自定义视图——onLayout源码 流程 思路详解
转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...
- Hash 哈希表和算法思路详解
概述 哈希表是一种可以满足快速查找数据结构,时间复杂度接近O(1). 哈希函数是无限集到有限集的映射. 处理数据量大,查找效率要求高时推荐使用hash容器. 问题: 什么情况下考虑使用哈希容器? 常用 ...
- LeetCode刷题 字符串详解
一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...
随机推荐
- Project Euler 39 Integer right triangles( 素勾股数 )
题意:若三边长 { a , b , c } 均为整数的直角三角形周长为 p ,当 p = 120 时,恰好存在三个不同的解:{ 20 , 48 , 52 } , { 24 , 45 , 51 } , ...
- Python3爬虫环境配置
一.包管理工具Anaconda安装 1.安装直接在官网下载最新版本的 https://www.continuum.io/downloads 2.配置环境变量PATH:C:\Users\Administ ...
- YII实现dropDownList 联动事件
因功能需求,需要用到联动,特此记录分享 一.视图中 <div class="main-form"> <?php $form = ActiveForm::begin ...
- Problem 11
Problem 11 # Problem_11.py """ In the 20×20 grid below, four numbers along a diagonal ...
- pythonWeb -- Django开发- Admin
[第一次使用Admin 要创建超级用户账号] 1.\ python manage.py createsuperuser You have 1 unapplied migration(s). Your ...
- NOIP2012 同余方程 题解
描写叙述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入仅仅有一行,包括两个正整数a, b,用一个空格隔开. 输出格式 输出仅仅有一行,包括一个正整数x0.即最小 ...
- HDU 4268 Alice and Bob(贪心+Multiset的应用)
题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...
- cocos2dx --- 在游戏中显示HTML页面
前文介绍了简单的富文本组件RichText,如今我们来了解下由freeType库做出来的第三方组件.可以直接显示html页面,而且可以实现超链接.和触摸事情. 步骤: 1.在github中 下载 ...
- poj--1985--Cow Marathon(树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4424 Accepted: 2214 Case ...
- poj--3169--Layout(简单差分约束)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9098 Accepted: 4347 Descriptio ...