Leetcode删除重复字母

1.明白题目规则

返回最小字典序

题目要求中的删除字母理解起来很容易,但是不改变原顺序和最小字典序小返回可能会误导我们.

  • 1.不改变原顺序就是,在删除重复字母的同时,其他的字母顺序不能改变,打个比方就是,一群人放在一起,并把它们排列好,然后把身高一样的人给挑出去,而身高都不相同的个人则不让他们动

  • 2.返回最小字典序,就是按照字典的规则,新华字典和英语字典大家都使用,字典序的规则和他们就是一样的

整个题目的意思就是把一群人放一起,挑出身高相同的人,直到支援这一个身高为止,同时这群人最后的排列方式最贴近身高从矮到高的排列方式

2.开始制定计划

  • 1.栈中只存数字,遇到符号时就开始运算

  • 2.栈中元素先进后出,明白计算规则

  • 3.根据后缀表达式明白如何入栈弹栈和计算

  • 举个例子:现在有一群人两两成双成一对,中缀表达式用这种方法来表达就是,一群人比试,比试之后才结果和定下的规则,后缀表达式则是一群人比试,先知道了结果和规则再进行比试,而这些+ - * /就是规则,所以每个符号要联系到两个数据,根据比试,先出结果的先结束,并且把结果揭示出来记录下来两个人的名单,那么这里的栈就可以当做一个记录两个人名单的一个笔记本,当两个人比赛结束,就把名单和结果给记录下来,所以每个结果和比赛的两个人是挨在一起的,因此每个运算符号,和用这个符号进行运算的数,也是挨在一起的,所以每次遇到一个运算符号就把栈顶的前两个元素弹出.

  • 4.输入数据,进行程序检测和运算

3.按照框架开始写入程序

  • 1.完成初始化栈的函数

  • 2.完成入栈函数

  • 3.完成出栈函数

  • 4.完成计算函数

  • 5.主函数运行

重要函数讲解

for(int i=0;i<Sl;i++)
    {   //printf("i=%d\n",i);
        int index=Judge_Stack[str[i]-'a'];//为0不在栈中,为1在栈中
        //printf("oouu%d",Judge_Stack[0]);
        if(!index)//如果此不字母在栈中,考虑是否覆盖前一个字母
        {   
            //top为栈顶指针用于判断栈中是否还有值,storage为栈,存储进栈的字母,当
            while(top>=0 && storage[top]>str[i]  &&  record_num[storage[top]-'a']>0)
            {   
                //覆盖函数               [Judge_Stack[storage[top]-'a']=0;
                //printf("  top1=%d  %c",top,storage[top]);//打印查看
                top--;//先把栈顶字母删除
                //printf("Ni号!");
​
            }
            //再把覆盖字母引入
            top++;
            storage[top]=str[i];
            Judge_Stack[str[i]-'a']=1;//说明此字母存在于栈中
            //printf("  top2=%d  %c",top,storage[top]);
            //printf("Nihao");
        }
​
        record_num[str[i]-'a']--;//每处理完一个字母该字母出现的次数就减1;
​
  • 1.先统计输入字符中每个字母的个数,并记录下来

  • 2.利用数组下标'b'-'a'转数字的特性,正好对应26个字母的顺序

  • 3.建立栈,开始组织字母入栈

  • 4.设计入栈规则:

    • 1.如果当前输入字母不在栈中,若栈顶元素字母字典与大于当前元素且后面还会重复出现,则当前字母直接覆盖栈中元素.

    • 2.如果当前字母不在栈中,若此字母只出现一次,则覆盖比自己大且还会重复出现的字母

    • 3.如果当前字母在栈中,则忽略(考虑字母重复且连续)

  • 5.完成逻辑思考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值