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.大小操作.关系运 ...
随机推荐
- P3378 【模板】堆
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...
- Linux 获取帮助
Linux中获取帮助的方法 方法: COMMAND --help 或者 help COMMAND whatis man或info 本地帮助文档 /usr/share/doc/ ...
- dtd对xml没有起到约束作用
问题如题. dtd: xml: BUG很明显,但是xml并没有提示错误信息.xml文档校验设置正常. 此处原因: dtd中元素与子元素设置之间缺少空格: 加上空格后正常报错:
- Android处理错误json数据
此前一直都没遇到也一直相信服务端返回的json数据基本是正确的,直到我们的android端一直崩溃,并在友盟上查到一直报如下的错误: com.google.gson.JsonSyntaxExcepti ...
- Android ViewGroup拦截触摸事件具体解释
前言 在自己定义ViewGroup中.有时候须要实现触摸事件拦截.比方ListView下拉刷新就是典型的触摸事件拦截的样例. 触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其ch ...
- Web Service学习-CXF开发Web Service实例demo(一)
Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...
- BAT常问问题总结以及回答(java基础回答一)
java 基础 八种基本数据类型的大小,以及他们的封装类 答:八种数据类型分别是byte(1字节)-128~127.short(2字节)-32768~32767.char(2字节).int(4字节) ...
- Jasperreport+ireport 实践操作及web应用
Jasperreport+ireport 实践操作及web应用 学习完jasperreports+ireport,给我感觉深刻,不仅掌握了报表开发技术,还掌握了怎样在web中生成pdf,xls,r ...
- 第一篇、Android Supersu 权限管理定制,隐藏过滤权限,指定APP最高权限
近期有个需求,在预装ROM的时候,须要权限,可是又不同意全部的应用都有权限,仅仅同意自己的应用有最高的权限(当然没有系统签名情况下). 所以.编译了CM 提取了supersu进行了二次定制,让他进行权 ...
- HDU 1113 Word Amalgamation (map 容器 + string容器)
http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...