小苯的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;
}

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

相关推荐
贾全3 分钟前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天18 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
oioihoii32 分钟前
C++11 forward_list 从基础到精通:原理、实践与性能优化
c++·性能优化·list
满分观察网友z36 分钟前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
m0_6873998440 分钟前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
森焱森2 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
呆瑜nuage2 小时前
数据结构——堆
数据结构
Ronin3052 小时前
【C++】类型转换
开发语言·c++
蓝澈11212 小时前
弗洛伊德(Floyd)算法-各个顶点之间的最短路径问题
java·数据结构·动态规划