小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题:C-小苯的IDE括号问题(easy)_牛客小白月赛87 (nowcoder.com)

D题: D-小苯的IDE括号问题(hard)_牛客小白月赛87 (nowcoder.com)

C题代码:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+10;
int n,k;
int l[N],r[N];

//删除操作
void remove(int x)
{
    r[l[x]] = r[x];
    l[r[x]] = l[x];
}

int main()
{
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    cin >> n >> k;
    string s;
    cin >> s;
    //做一个标记头尾哨子
    s = "L" + s + "R";
    int pos = 0; //标记位置,用来去找鼠标I的位置
    for(int i=1;i<s.size();i++)
    {
        if(s[i] == 'I')
        {
            pos = i;
            break;
        }
    }
    r[0] = s.size()-1,l[s.size()-1] = 0;
    for(int i=1;i<s.size();i++)
    {
        //插入操作(插入指向左右指针)
        int left = i-1,right = r[i-1];
        l[i] = left,r[i] = right;
        l[right] = i,r[left] = i;
    }
    while(k--)
    {
        string str;
        cin >> str;
        if(str == "backspace")
        {
            if(s[l[pos]] == '(' && s[r[pos]] == ')')
            {
                remove(l[pos]);
                remove(r[pos]);
            }
            else{
                if(s[l[pos]] == 'L') continue;
                remove(l[pos]);
            }
        }
        else{
            if(s[r[pos]] == 'R') continue;
            remove(r[pos]);
        }
    }
    for(int i=r[0];i!=s.size()-1;i=r[i])
        cout << s[i];
    return 0;
}

D题代码:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+10;
int l[N],r[N];
int n,k;

void remove(int x)
{
    r[l[x]] = r[x];
    l[r[x]] = l[x];
}

int main()
{
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    cin >> n >> k;
    string s;
    cin >> s;
    s = "L" + s + "R";
    int pos = 0;
    for(int i=1;i<=n;i++)
    {
        if(s[i] == 'I')
        {
            pos = i;
            break;
        }
    }
    //这里对于C题换了一种写法,两种都可以
    r[0] = s.size()-1,l[s.size()-1] = 0;
    for (int i = 1; i <=n+1 ; i++) 
        l[i] = i - 1, r[i - 1] = i;
    while(k--)
    {
        string str;
        cin >> str;
        if(str == "backspace")
        {
            if(s[l[pos]] == '(' && s[r[pos]] == ')')
            {
                remove(l[pos]);
                remove(r[pos]);
            }
            else{
                if(s[l[pos]] == 'L') continue;
                remove(l[pos]);
            }
        }
        else if(str == "delete")
        {
            //注意:这块一定要仔细读题不要落条件,不写会超时(本人的错)    
            if(s[r[pos]] == 'R') continue;
            remove(r[pos]);
        }
        else if(str == "->")
        {
            if(s[r[pos]] != 'R')
            {
                //交换只改变原数组,不改变双链表
                //删除只改变双链表,不改变原数组   
                int idx = r[pos];
                swap(s[idx],s[pos]);
                pos = idx; //一定要挪动一下pos的位置
            }
        }
        else
        {
            if(s[l[pos]]!='L')
            {
                int idx = l[pos];
                //这里交换原数组不会改变,双链表数组
                swap(s[idx],s[pos]);
                pos = idx;
            }
        }
    }
    //遍历链表
    for(int i=r[0];i!=s.size()-1; i=r[i])
        cout << s[i];
    return 0;
}

双链表 一定要多动手模拟,手动去做一下删除和插入操作,自己就会深有体会

相关推荐
PyHaVolask22 分钟前
数据结构与算法分析
数据结构·算法·图论
小王C语言23 分钟前
封装红黑树实现mymap和myset
linux·服务器·算法
幸运小圣31 分钟前
Set数据结构【ES6】
javascript·数据结构·es6
大佬,救命!!!42 分钟前
算法实现迭代2_堆排序
数据结构·python·算法·学习笔记·堆排序
Dream it possible!1 小时前
LeetCode 面试经典 150_栈_简化路径(53_71_C++_中等)(栈+stringstream)
c++·leetcode·面试·
爱和冰阔落1 小时前
【C++继承下】继承与友元 / static 菱形继承与虚继承 组合的详解分析
c++·面试·腾讯云ai代码助手
天桥下的卖艺者1 小时前
R语言手搓一个计算生存分析C指数(C-index)的函数算法
c语言·算法·r语言
Espresso Macchiato1 小时前
Leetcode 3715. Sum of Perfect Square Ancestors
算法·leetcode·职场和发展·leetcode hard·树的遍历·leetcode 3715·leetcode周赛471
草莓熊Lotso2 小时前
《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》
开发语言·c++·算法
敲上瘾2 小时前
单序列和双序列问题——动态规划
c++·算法·动态规划