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

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

相关推荐
GoWjw21 分钟前
在C&C++中结构体的惯用方法
c语言·开发语言·c++
明洞日记31 分钟前
【VTK手册027】VTK 颜色连续映射:vtkColorTransferFunction 深度解析与实战指南
c++·图像处理·算法·vtk·图形渲染
Bruce_kaizy36 分钟前
c++单调数据结构————单调栈,单调队列
开发语言·数据结构·c++
默凉40 分钟前
win 制作vs离线安装包
c++
阿坤带你走近大数据41 分钟前
Python基础知识-数据结构篇
开发语言·数据结构·python
B_lack02642 分钟前
西门子PLC结构化编程_线性插值算法功能块
算法·pid·西门子plc·博途·线性插值·开环控制
fufu031144 分钟前
Linux环境下的C语言编程(四十三)
linux·c语言·算法
dragoooon341 小时前
[C++——lesson32.数据结构进阶——「初识哈希」]
数据结构·c++·哈希算法
猿饵块1 小时前
git--windows安装和配置
c++
业精于勤的牙1 小时前
三角形最小路径和(二)
算法