我算是一个算法小白,要从基础一点点来抠算法。遇到栈的问题的时我在想,究竟什么样的问题是需要利用栈来解决的呢。栈的特点就是先进后出。那么当遇到和配对相关的题目的时候,我们都可以考虑利用栈的方法来解决。
今天我想跟大家分享的是利用栈来解决字符串的相关问题。其实嫩够利用栈来解决的问题,大部分也都可以通过递归来解决,只不过递归的思路很绕。今天会列举三个题目,都会通过2种方法来做一下。
三个题目分别是:
856 https://leetcode-cn.com/problems/score-of-parentheses/
394 https://leetcode-cn.com/problems/decode-string/
224 https://leetcode-cn.com/problems/basic-calculator/
856 括号的分数
方法一:利用栈
1、遇到‘(’入栈,遇到‘)’出栈,这里用-1代替‘(’。
2、如果当前的sum 是0,则将1入栈。如果sum不等于0,则将sum * 2入栈。
3、将栈中的元素求和。
/*
*尝试使用栈的方法解决一下这道题
*遇到‘(’入栈,遇到‘)’出栈。
*/
#define MAX_LEN 100
int scoreOfParentheses(char *S)
{
int index = 0;
int stackIndex = -1;
int sum = 0;
int returnNum = 0;
int *stack = (int *)malloc(sizeof(int) * MAX_LEN);
while (S[index] != '\0') {
if (S[index] == '(') {
stack[++stackIndex] = -1;
} else if (S[index] == ')') {
// 将栈中元素相加
while (stack[stackIndex] != -1){
sum = sum + stack[stackIndex];
stackIndex--;
}
if (sum == 0) {
stack[stackIndex] = 1;
} else {
stack[stackIndex] = (sum * 2);
}
sum = 0;
}
index++;
}
// 栈中元素求和
int i;
for (i = 0; i <= stackIndex; i++) {
returnNum = returnNum + stack[i];
}
return returnNum;
}
方法二:递归
使用递归的方法主要需要考虑到什么时候进入递归,什么时候函数返回。找准这个时机,好像理解起来就比较快。本题的关键点在于,遇到‘(’开始递归,遇到‘)’结束递归。但是在结束递归的时候返回当前的值。如果是0,说明只有单层括号,返回1;如果不是0,说明是括号嵌套,返回sum * 2;在递归外面进行返回的值累加。中的结束条件就是字符串遍历完毕。
/*
*递归的方法。
*主要的点在于区分出递归里面和外面的值。
*/
int Dfs(char *s, int *index)
{
int sum = 0;
while (s[*index] != '\0') {
if (s[*index] == '(') {
(*index)++;
sum +=