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.大小操作.关系运 ...
随机推荐
- nyoj314-斐波那契数列四吧
斐波那契数列四吧 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 斐波那契数列为:0,1,1,2,3,5,8,13....,常规递推公式为f(n)=f(n-1)+f(n- ...
- 3.2、Ansible单命令测试
0.Ansible的group支持all.通配符(*).IP地址 1.查看Ansible的版本 $ ansbile --version [root@test ~]# ansible --versi ...
- linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器
// 假设远程服务器IP地址为 192.168.1.100 1.从服务器复制文件到本地: scp root@192.168.1.100:/data/test.txt /home/myfile/ roo ...
- Redis 报错:MISCONF Redis is configured to save RDB snapshots
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Com ...
- 在本地生成ssh-key 免密码远程clone GitLab中的项目到本地
每次项目push.pull都需要输入账号和密码,很烦,方便免密pull与push代码,在本地需要用git bash 创建一个公钥,然后在gitlab中把公钥保存下来. 步骤如下: 1.打开 git b ...
- ElasticSearch[v6.2] 在实际项目中的应用
摘要:本文所讲述的内容,为ElasticSearch(以下简称ES)全文搜索引擎在实际大数据项目的应用:ES的底层是开源库 Lucene.但是,你没法直接用 Lucene,必须自己写代码去调用它的接口 ...
- HTTP中的重定向和请求转发的区别(转)
时间长有些忘了,转篇文章加深一下印象: 一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下:request.getRequestDispatcher("new.jsp&qu ...
- ubuntu--dpkg 被中断
主要原因应该是/var/lib/dpkg/updates 文件夹里面的资料有错误,使得更新软件的程序出现错误,所以得把它们完全删除,通过sudo apt-get update这个指令会重新建立这些资料 ...
- Grand Central Dispatch(GCD)详解
概述 GCD是苹果异步执行任务技术,将应用程序中的线程管理的代码在系统级中实现.开发者只需要定义想要执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.由于 ...
- BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2534 Solved: 1129 [Submit][Status][Discu ...