1. 题目描述

给定一个平衡括号字符串 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的情况。

(()(()))也是一个子串(...)。

我们可以发现一个特点:子串的第一个符号’(‘和最后一个符号‘)’永远是匹配的一对括号。

这样的话,就可以将整个问题划分为以下几个子问题:

  1. 判断S有几个子串(...),让这些子串的分数相加即可。
  2. 然后子串里面有可能又是若干个子串的相加情况,例如(()()),我们就让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 递归思路详解的更多相关文章

  1. BaseAdapter自定义适配器——思路详解

    BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...

  2. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  3. 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...

  4. [转]Vue项目全局配置微信分享思路详解

    这篇文章给大家介绍了vue项目全局配置微信分享思路讲解,使用vue作为框架,使用vux作为ui组件库,具体内容详情大家跟随脚本之家小编一起学习吧 这个项目为移动端项目,主要用于接入公众号服务.项目采用 ...

  5. python编写微信公众号首图思路详解

    前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式 ...

  6. ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...

  7. 【转】ANDROID自定义视图——onLayout源码 流程 思路详解

    转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...

  8. Hash 哈希表和算法思路详解

    概述 哈希表是一种可以满足快速查找数据结构,时间复杂度接近O(1). 哈希函数是无限集到有限集的映射. 处理数据量大,查找效率要求高时推荐使用hash容器. 问题: 什么情况下考虑使用哈希容器? 常用 ...

  9. LeetCode刷题 字符串详解

    一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...

随机推荐

  1. [luogu3232 HNOI2013] 游走 (高斯消元 期望)

    传送门 题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等 ...

  2. Django入门--模板标签、继承与引用

    一.模板标签 Django模板引擎提供的可以在模板中进行的各种逻辑操作,是函数调用的一种特殊形式,如循环.判断等功能,期语法规则为: {% tag %} content {% tag 参数1 参数2 ...

  3. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结】【题解往前或往后翻,不在这】

    又是爆炸的一场 心态有点小崩.但问题不大.. 看A题,一直担心有多个正方形..小心翼翼地看完之后,毅然地交上去了. [00:08] A[Accpted] 然后开始看B题. 觉得和之前做的某题很像,但翻 ...

  4. 04springMVC数据类型转换

    数据类型转换简介 Spring Web MVC中的数据类型转换 内建的类型转换器 自定义类型转换器 1      数据类型转换简介 当从页面提交数据到后台Action的时候,通过请求发送的数据,通常都 ...

  5. HDU 3507

    斜率DP入门题.推荐看看这篇http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 看过之后,自己思考,发现有些不妥之处就是,其 ...

  6. 请用Java设计一个Least Recently Used (LRU) 缓存

    LRU介绍:LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的, 思路介绍: 能够使用两个标准的数据结构来实现.Map和Queue.由于须要支持多 ...

  7. spring batch(一):基础部分

    spring batch(一):基础部分 博客分类: Spring java   spring batch 官网: http://www.springsource.org/spring-batch 下 ...

  8. RecyclerView的点击事件

    RecyclerView 一.简单介绍 这个是谷歌官方出的控件.使我们能够很easy的做出列表装的一个控件,当然recyclerview的功能不止这些,它还能够做出瀑布流的效果,这是一个很强大的控件, ...

  9. hdu 3697 Selecting courses (暴力+贪心)

    Selecting courses Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 62768/32768 K (Java/Others ...

  10. 使用CNN做电影评论的负面检测——本质上感觉和ngram或者LSTM同,因为CNN里图像检测卷积一般是3x3,而文本分类的话是直接是一维的3、4、5

    代码如下: from __future__ import division, print_function, absolute_import import tensorflow as tf impor ...