有效的括号长按键入验证外星语词典字符的最短距离用栈实现队列

有效的括号

来源:杭哥

20. 有效的括号 - 力扣(LeetCode)

bool isValid(char * s)
{
    int sz=strlen(s);
    char stack[sz];
    int k=0;
    for (int i=0;i<sz;i++)
    {
        if (s[i]=='(' || s[i]=='[' || s[i]=='{')
        {

            stack[k++]=s[i];

        }
        else
        {
            if (k==0)
            {
                return false;
            }
            else if (s[i]=='}' && stack[k-1]!='{')
            {
                return false;
            }
            else if (s[i]==']' && stack[k-1]!='[')
            {
                return false;
            }
            else if (s[i]==')' && stack[k-1]!='(')
            {
                return false;
            }
            k--;
        }
    }
    if (k!=0)
    {
        return false;
    }
    return true;
}
我想说:
  1. 这时候就要用栈这种数据结构了,非常方便。


长按键入

来源:自己LeetCode刷题

925. 长按键入 - 力扣(LeetCode)

bool isLongPressedName(char * name, char * typed)
{
    int sz1=strlen(name);
    int sz2=strlen(typed);
    int i=0;
    int j=0;
    if (name[i]==typed[j])
    {
        i++;
        j++;
    }
    else
    {
        return false;
    }
    while(i<=sz1-1 && j<=sz2-1)
    {
        if (name[i]==typed[j])
        {
            i++;
            j++;
        }
        else
        {
            if (typed[j]==typed[j-1])
            {
                j++;
            }
            else
            {
                return false;
            }
        }
    }
    if (i==sz1)
    {
        if (j==sz2)
        {
            return true;
        }
        char ch=name[sz1-1];
        while(j<sz2)
        {
            if (typed[j]!=ch)
            {
                return false;
            }
            j++;
        }   
    }
    else
    {
        return false;
    }
    return true;
}
我想说:
  1. 这道题目的话可以用双指针来做,逻辑关系想想清楚,然后代码能力稍微有一点的话就可以做出来


验证外星语词典

来源:自己LeetCode刷题

953. 验证外星语词典 - 力扣(LeetCode)

bool isAlienSorted(char ** words, int wordsSize, char * order)
{
    int alpha[26]={0};
    for (int i=0;i<26;i++)
    {
        alpha[order[i]-'a']=i;
    }
    for (int i=0;i<wordsSize-1;i++)
    {
        char* s1=words[i];
        char* s2=words[i+1];
        while (*s1!='\0' && *s2!='\0' && alpha[*s1-'a']==alpha[*s2-'a'])
        {
            s1++;
            s2++;
        }
        if ((*s1=='\0' && *s2!='\0') || (*s1=='\0' && *s2=='\0'))
        {
            continue;
        }
        else if (*s1!='\0' && *s2=='\0')
        {
            return false;
        }
        if (alpha[*s1-'a']<alpha[*s2-'a'])
        {
            continue;
        }
        else if (alpha[*s1-'a']>alpha[*s2-'a'])
        {
            return false;
        }
    }
    return true;
}
我想说:
  1. 字符与整数之间可以灵活转化,因为字符其实本质上就是ACSII码,就是整型。


字符的最短距离

来源:自己LeetCode刷题

821. 字符的最短距离 - 力扣(LeetCode)

typedef struct point 
{
    int a;
    int b;
}point;
int* shortestToChar(char * s, char c, int* returnSize)
{
    int sz=strlen(s);
    int* ans = (int*)malloc(sizeof(int)*sz);
    *returnSize=sz;
    for (int i=0;i<sz;i++)
    {
        ans[i]=-1;
    }
    point queue[10000]={0};
    int hh=0;
    int tt=-1;
    for (int i=0;i<sz;i++)
    {
        if (s[i]==c)
        {
            tt++;
            queue[tt].a=i;
            queue[tt].b=0;
            ans[i]=0;
        }
    }
    while(hh<=tt)
    {
        int aa=queue[hh].a;
        int bb=queue[hh].b;
        hh++;
        if (aa-1>=0 && ans[aa-1]==-1)
        {
            ans[aa-1]=bb+1;
            tt++;
            queue[tt].a=aa-1;
            queue[tt].b=bb+1;
        }
        if (aa+1<sz && ans[aa+1]==-1)
        {
            ans[aa+1]=bb+1;
            tt++;
            queue[tt].a=aa+1;
            queue[tt].b=bb+1;
        }
    }
    return ans;
}
我想说:
  1. 首先得提一下语法问题,当用malloc在内存的堆区开辟一块连续空间的时候,其实我们都知道与数组没有什么区别,但是如果想把这块堆区空间的值,比如说全部初始化成-1,不能memset(arr , 0xff , sizeof(arr)),bty数组这样子干没有问题。这个与数组是有区别的,只能for循环一个一个去初始化。

  1. 这个方法用到了队列

#define MIN(a,b) ((a)<(b)?(a):(b))
int* shortestToChar(char * s, char c, int* returnSize)
{
    int sz=strlen(s);
    int* ans = (int*)malloc(sizeof(int)*sz);
    *returnSize=sz;
    int idx=(-1)*sz;
    for (int i=0;i<sz;i++)
    {
        if (s[i]==c)
        {
            idx=i;
        }
        ans[i]=i-idx;
    }
    idx=2*sz;
    for (int i=sz-1;i>=0;i--)
    {
        if (s[i]==c)
        {
            idx=i;
        }
        ans[i]=MIN(ans[i],idx-i);
    }
    return ans;
}
我想说:
  1. 这种方法的话就比较新奇,先从左往右遍历,这时候我统计的是左端距离字符c最近是多少(只关注左端);然后我从右往左遍历,这时候我统计的是右端距离字符c最近是多少(只关注右端),注意:还要与之前的数值取小。

  1. 然后在遍历的时候一开始都是不知道字符c在哪里的,这时候就假定idx为-n 或者 2n


用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

typedef int STDataType;
typedef struct Stack
{
    int top;
    int capacity;
    STDataType* p;
}ST;


void STInit(ST* pst)
{
    assert(pst);
    pst->p = (STDataType*)malloc(sizeof(STDataType)*100);
    if (pst->p==NULL)
    {
        perror("STInit::Malloc");
        return;
    }
    pst->top=0;
    pst->capacity=100;
}


void STDestroy(ST* pst)
{
    assert(pst);
    free(pst->p);
    pst->p=NULL;
    pst->top=0;
    pst->capacity=0;
}


void STPush(ST* pst, STDataType x)
{
    assert(pst);
    if (pst->top==pst->capacity)
    {
        STDataType* pp=(STDataType*)realloc(pst->p,sizeof(STDataType)*(pst->capacity)*2);
        if (pp==NULL)
        {
            perror("STPush::Realloc");
            return;
        }
        pst->p=pp;
        pst->capacity*=2;
    }
    pst->p[pst->top]=x;
    pst->top++;
}


void STPop(ST* pst)
{
    assert(pst);
    assert(pst->top>0);
    pst->top--;
}


bool STEmpty(ST* pst)
{
    assert(pst);
    return pst->top==0;
}


int STTop(ST* pst)
{
    assert(pst);
    assert(pst->top>0);
    return pst->p[pst->top-1];
} 



int STSize(ST* pst)
{
    assert(pst);
    return pst->top;
}


///


typedef struct 
{
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() 
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    if (obj==NULL)
    {
        perror("malloc::fail");
        return NULL;
    }
    STInit(&obj->pushst);
    STInit(&obj->popst);
    return obj;
}


void myQueuePush(MyQueue* obj, int x) 
{
    assert(obj);
    STPush(&obj->pushst,x);
}


int myQueuePop(MyQueue* obj) 
{
    assert(obj);
    if (STEmpty(&obj->popst))
    {
        int num=STSize(&obj->pushst);
        for (int i=0;i<num;i++)
        {
            STDataType tmp=STTop(&obj->pushst);
            STPush(&obj->popst,tmp);
            STPop(&obj->pushst);
        }
    }
    int ans=STTop(&obj->popst);
    STPop(&obj->popst);
    return ans;
}


bool myQueueEmpty(MyQueue* obj) 
{
    assert(obj);
    return (&(obj->pushst))->top == 0 && (&(obj->popst))->top == 0;
}


int myQueuePeek(MyQueue* obj) 
{
    assert(obj);
    if (STEmpty(&obj->popst))
    {
        int num=STSize(&obj->pushst);
        for (int i=0;i<num;i++)
        {
            STDataType tmp=STTop(&obj->pushst);
            STPush(&obj->popst,tmp);
            STPop(&obj->pushst);
        }
    }
    int ans=STTop(&obj->popst);
    return ans;
}


void myQueueFree(MyQueue* obj) 
{
    assert(obj);
    STDestroy(&obj->pushst);
    STDestroy(&obj->popst);
}
我想说:
  1. 这道题的话,它的方法非常的奇特,一个栈就是定向很明确的,专门用来放入数据,另外一个栈专门用来弹出数据,这个不像之前的用队列去模拟栈,哪个队列不为空,我就往哪个队列里面去插入数据。

  1. 然后这边的话出数据的栈它里面的数据都是从入数据的栈那边倒过来的,然后等到你这个栈出数据如果出空了,就再从另外一个栈那边把数据给倒过来。在这个问题当中,两个栈的功能是极其明确的,是固定的。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ Qt自建网页浏览器

C Qt自建网页浏览器如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<C Qt自建网页浏览器>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文…

VSCode嵌入式开发环境搭建

Vscode开发环境搭建 看这个链接就可以了&#xff0c;后面下载调试有点问题看下3.3。 在VSCode上部署STM32F1的开发环境 1. MXCube配置工程生成Makefile文件 借助正确的编译工具链进行编译&#xff0c; 2. 编译工具链搭建 编译工具链使用GCC的ARM版本 arm-none-eabi-gcc &am…

servlet

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Servlet 是什么第一个 Servlet 程序1.创建项目2.引入依赖3.创建目录结构4.编写代码5.打包程序6.部署程序7.验证更方便的部署方…

【Linux】基础IO(一) :文件描述符,文件流指针,重定向

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 码字不易&#xff0c;请多多支持&#x1f618;&#x1f618; 这是目录重新认识文件系统内部的文件操作我们C语言的文件操作系统内部的文件操作OS一般会如何让用户给自己传递标志位的&#x…

springboot: mybatis动态拼接sql查询条件

目录 需求01: 根据不同类型 查询不同的订单名, 1. 书写订单 类型转换方法 2. 使用方式: 3.. 构建条件构造器并进行查询, 传递查询参数 4. Mapper 写法 5. 最核心位置 xml位置 6. sql执行效果: 需求01: 根据不同类型 查询不同的订单名, 条件也是不同的, 需要复用sql…

Dubbo的独门绝技,SPI实现原理分析

文章目录前言普通SPI实现原理实例化扩展点源码分析扩展点加载流程分析LoadingStrategy分析接口定义接口实现加载原理loadClass方法分析自适应SPI实现原理自适应扩展代码生成分析自激活SPI简单使用原理分析Activate注解源码分析IOC实现原理objectFactory介绍总结AOP实现原理总结…

Chapter7.1:频域分析法理论基础

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

JS 处理后台返回的数据

前言 常规情况下&#xff0c;我们可以把后台返回给我们的数据直接渲染在前台页面上&#xff0c;但不排除一些特殊的情况需要我们对源数据进行处理&#xff0c;例如 element 上传组件&#xff0c;在编辑页面中的回显指定参数为 name 和 url&#xff0c;但是后台返回的如果不是这…

【MySQL】1 MySQL的下载、安装与配置|提供安装包

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 目前,已开了以下专栏,欢迎关注与指导 1️⃣Java基础知识系统学习(持续更文中…) 2️⃣UML(已更完) 3️⃣MySQL(持续更文中…) MYSQL的下载、安装与配置1.下载MySQL5.71.1安装包的获…

C++入门教程||C++ 数字||C++ 数组

C 数字通常&#xff0c;当我们需要用到数字时&#xff0c;我们会使用原始的数据类型&#xff0c;如 int、short、long、float 和 double 等等。这些用于数字的数据类型&#xff0c;其可能的值和数值范围&#xff0c;我们已经在 C 数据类型一章中讨论过。C 定义数字我们已经在之…

NSSCTF-[NCTF 2021]狗狗的秘密

题目链接&#xff1a;NSSCTF 根据题目标签&#xff0c;这道题考了SMC&#xff0c;xtea和base47。 无壳&#xff0c;载入IDA&#xff0c;看main函数可知输入长度是42。然后创造了新线程&#xff0c;进入线程开始地址StartAddress。 是一个赋值语句就没别的了&#xff0c;很迷。…

【5G RRC】NR测量事件介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【STL四】序列容器——vector容器

【STL容器】序列容器——vector容器一、简介二、头文件三、模板类四、成员函数1、迭代器2、元素访问3、容量4、修改操作五、demo1、容量reserve、capacity、shrink_to_fit2、修改操作pop_back()、push_back3、修改操作insert()4、修改操作emplace()5、修改操作erase()、swap()、…

202209-3 CCF 防疫大数据 满分题解(超详细讲解 + 注释代码) + 解题思路(STL模拟)

问题描述 解题思路 首先题意是给出n天的漫游信息以及n天的风险地区名单 求n天的风险人群 根据题意肯定要将漫游信息存储下来&#xff0c;用结构体数组比较合适 在判断该用户是否是风险人群时&#xff0c;需要判断[d1, d]区间内地点r是否是风险地区&#xff0c;所以需要把地点…

JAVA开发(自研项目的开发与推广)

https://live.csdn.net/v/284629 案例背景&#xff1a; 作为JAVA开发人员&#xff0c;我们可以开发无数多的web项目&#xff0c;电商系统&#xff0c;小程序&#xff0c;H5商城。有时候作为技术研发负责人&#xff0c;项目做成了有时候也需要对内进行内测&#xff0c;对外进行…

PHP+vue+elementUI高校食堂校园餐厅点餐系统

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 开发软件&#xff1a;hbuilderx/vscode/Dreamweaver/PhpSt…

项目管理工具哪个好?最新排名

项目管理工具当下已经成为项目团队的重要榜首&#xff0c;一款合适好用的项目管理工具可以帮助处理很多机械化工作&#xff0c;将管理者更多精力投入到更有价值的工作中&#xff0c;还可以帮助团队组织和计划项目&#xff0c;跟踪进度&#xff0c;处理预算和协作。该如何挑选帮…

什么是Vue

✅作者简介&#xff1a;CSDN一位小博主&#xff0c;正在学习前端&#xff0c;欢迎大家一起来交流学习&#x1f3c6; &#x1f4c3;个人主页&#xff1a;白月光777的CSDN博客 &#x1f525;系列专栏&#xff1a;Vue从入门到进阶 &#x1f4ac;个人格言&#xff1a;但行好事&…

【面试题】大厂面试官:你做过什么有亮点的项目吗?

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库前言大厂面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目…

React--》状态管理工具—Mobx的讲解与使用

目录 Mobx的讲解与使用 Mobx环境配置 Mobx的基本使用 Mobx计算属性的使用 Mobx监听属性的使用 Mobx处理异步的使用 Mobx的模块化 Mobx的讲解与使用 Mobx是一个可以和React良好配合的集中状态管理工具&#xff0c;mobx和react的关系相当于vuex和vue之间的关系&#xff0…