leetcode 算法栈系列应用二(利用栈解决字符串相关问题)

本文介绍了如何使用栈来解决LeetCode中与字符串相关的算法问题,包括括号的分数、字符串解码和基本计算器。通过两种方法——栈和递归——详细解释了解题思路,并提供了具体的解题步骤。
摘要由CSDN通过智能技术生成

我算是一个算法小白,要从基础一点点来抠算法。遇到栈的问题的时我在想,究竟什么样的问题是需要利用栈来解决的呢。栈的特点就是先进后出。那么当遇到和配对相关的题目的时候,我们都可以考虑利用栈的方法来解决。
今天我想跟大家分享的是利用栈来解决字符串的相关问题。其实嫩够利用栈来解决的问题,大部分也都可以通过递归来解决,只不过递归的思路很绕。今天会列举三个题目,都会通过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 += 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值