当前位置: 首页 > news >正文

力扣316去除重复字母-单调栈

题目来源:

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 1:

输入:s = "bcabc"
输出"abc"

示例 2:

输入:s = "cbacdcbc"
输出:"acdb"

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

题目最好情况就是所有字母单调递增,这样全部返回


s = "cbacdcbc"对于这个例子,c入栈,b要入栈发现b比c小,通过观察答案这个c是被去掉了的

为什么,因为后续还有c(关键点1),c在b后面肯定是不在b前面好的(题目要求),所以c应该被去掉

,所以去掉a,然后b入栈,a入栈的时候发现a比b小,且b后面还有出现,所以b出栈,然后c入栈,

d入栈,c要入栈,c已经在栈中了(关键点2,需为在栈中的字符设置标记),所以跳过这个c,b入栈,发现b比栈顶小,但是后面已经没有d了,所以栈顶元素d不能出栈,然后c同样,栈已经存在,跳过

得到最终答案acdb


当一个字母要入栈,那么栈顶的元素是比他小的,那么是最好的,这个元素可以入栈

如果栈顶元素比他大呢,我们是否要将他去掉吗,不,如果待搜索的字母中(还未入栈)不包括栈顶元素,那么他是不应该被删掉的,在这种情况,我们就得知道栈顶元素的字母后续是否会出现,

故得出:题目关键点1:记录字母-出现次数的映射关系

public class A316 {
    public static String removeDuplicateLetters(String s) {
        int length=s.length();
        int[] num=new int[26];
int[] vis=new int[26]; //vis[i]==1表示被访问过
StringBuilder stk=new StringBuilder();
         //记录元素个数
        for(int i=0;i< s.length();i++){
            char cur=s.charAt(i);
            num[cur-'a']++;
        }
        //元素进栈,如果比栈顶小,并且栈顶对于字母还有,那么栈顶出,直到栈顶元素比当前元素还小---入栈---对应数目减1
        //如果比栈顶大,入栈
for(int i=0;i<length;i++){
    char cur=s.charAt(i);
    num[cur-'a']--;
    //如果该元素在栈中了,跳过
    if(vis[cur-'a']==1)continue;



    //如果栈为空或者栈顶元素小于该元素,该元素入栈
    if(stk.length()==0||cur- stk.charAt(stk.length()-1)>0){
        stk.append(cur);//入栈
        vis[cur-'a']=1;//标记为该元素在栈中
    }
    //如果比栈顶元素小或者和栈顶元素相等
    else{
        //栈不为空且栈顶元素大于该元素,且栈顶元素后续还有,则栈顶元素出栈
        while(stk.length()>0&&stk.charAt(stk.length()-1)>cur&&num[stk.charAt(stk.length()-1)-'a']!=0){//比栈顶元素小或者和栈顶元素相等且栈顶元素后续还有,则栈顶元素出
            vis[stk.charAt(stk.length()-1)-'a']=0;//标记为没在栈中
            //出栈
            stk.deleteCharAt(stk.length()-1);
        }
     //该元素入栈
        stk.append(cur);
        vis[cur-'a']=1;//标记为入栈了
    }
}
        String res= stk.toString();
return res;
    }

    public static void main(String[] args) {
        String s="cbacdcbc";
        String s1 = removeDuplicateLetters(s);
        System.out.println(s1);
    }
}

相关文章:

  • python 3.9 随机生成 以UTF-8 编码 的随机中文
  • 基于大模型的GCSE预测与治疗优化系统技术方案
  • Ubuntu中MATLAB启动图标设置
  • Opencv计算机视觉编程攻略-第十一节 三维重建
  • 蓝桥杯—数字接龙(dfs+减枝)
  • Vue中使用antd-table组件实现数据选择、禁用、已选择禁用-demo
  • 从传统物流到智能调度的全链路升级
  • 配置GRE-tunnel隧道(思科华为)
  • 水产养殖水下监控无人机推荐-P200PRO
  • 什么是可靠性工程师?
  • C++---day7
  • Chapter 7: Compiling C++ Sources with CMake_《Modern CMake for C++》_Notes
  • unittest测试模块:Python 标准库中的单元测试利器
  • 蒙小几何-全等,相似,等值
  • 【java图形化界面编程】
  • 网易运维面试题及参考答案
  • 【天梯赛】L2_005 集合相似度(C++)
  • Apache Kafka全栈技术解析
  • STM32——DMA
  • 从火险预测到智能指挥,地理信息系统的“硬核”突围
  • 网站开发技术介绍/欧洲站fba
  • 百度云建站WordPress/百度关键词排名联系方式
  • 美团是最早做团购的网站么/搭建网站多少钱
  • 沧州黄骅市贴吧/登封搜索引擎优化
  • 网站的营销与推广/关键词排名优化网站
  • js弹出网站/电脑培训学校排名