Remove Duplicate Letters I

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once.

Example:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "abcd"

  1. public class Solution {
  2. public String removeDuplicateLetters(String s) {
  3. if (s == null || s.length() <= )
  4. return s;
  5.  
  6. int res = ;
  7. for (int i = ; i < s.length(); i++) {
  8. res = res | ( << s.charAt(i) - 'a');
  9. }
  10.  
  11. StringBuilder sb = new StringBuilder();
  12. int k = ;
  13. for (int i = ; i < ; i++) {
  14. if ((res & (k << i)) != ) {
  15. sb.append((char) ('a' + i));
  16. }
  17. }
  18. return sb.toString();
  19. }
  20. }

Remove Duplicate Letters II

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"

分析:https://segmentfault.com/a/1190000004188227

这道题要保证顺序要一致,而且还是最小的。

读字符的过程中,把字符存到stack里,当发现stack之前存的字符中比当前字符大 (这是一个很好的思路,如果当前字符或者数字需要与前面的字符或者数字比较,并且比较结果和以前的状态不一样,可以考虑用stack。)而且频率还大于0就可以把那个字符pop出去。类似这种题目都可以用stack解决。基本思想就是在一定的限制条件下pop出比当前选择差的元素。

  1. public class Solution {
  2. public String removeDuplicateLetters(String s) {
  3. int[] freqs = new int[];
  4.  
  5. // 统计字符频率
  6. for (int i = ; i < s.length(); i++) {
  7. freqs[s.charAt(i)]++;
  8. }
  9.  
  10. boolean[] visited = new boolean[]; // 用来标记存在stack里的字符
  11. Deque<Character> q = new ArrayDeque<>();
  12.  
  13. for (int i = ; i < s.length(); i++) {
  14. char c = s.charAt(i);
  15. freqs[c]--;
  16. if (visited[c]) continue;
  17.  
  18. // pop出stack当中比当前字符大但后面还存在的的字符,
  19. while (!q.isEmpty() && q.peek() > c && freqs[q.peek()] > ) {
  20. visited[q.pop()] = false;
  21. }
  22. q.push(c);
  23. visited[c] = true;
  24. }
  25.  
  26. StringBuilder sb = new StringBuilder();
  27. for (char c : q) {
  28. sb.append(c);
  29. }
  30.  
  31. return sb.reverse().toString();
  32. }
  33. }

Remove Duplicate Letters I & II的更多相关文章

  1. Remove Duplicate Letters

    316. Remove Duplicate Letters Total Accepted: 2367 Total Submissions: 12388 Difficulty: Medium Given ...

  2. [Swift]LeetCode316. 去除重复字母 | Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  3. [LeetCode] Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  4. 316. Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  5. LeetCode Remove Duplicate Letters

    原题链接在这里:https://leetcode.com/problems/remove-duplicate-letters/ 题目: Given a string which contains on ...

  6. leetcode@ [316] Remove Duplicate Letters (Stack & Greedy)

    https://leetcode.com/problems/remove-duplicate-letters/ Given a string which contains only lowercase ...

  7. Remove Duplicate Letters(Java 递归与非递归)

    题目介绍: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  8. 【lintcode】834. Remove Duplicate Letters

    题目描述: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  9. 316. Remove Duplicate Letters (accumulate -> count of the difference elements in a vector)

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

随机推荐

  1. shutdown命令用法

    首先我们先创建一个txt文件,添加shutdown -r -f -t 0 ,文件点击另存为,选择所有类型,保存格式为“重启.bat”文件. 说明:shutdown命令用法: /r         关闭 ...

  2. rpm 命令

    这些事rpm的常用参数!!! 你可以在linux下man 一下rpm就知道了!!! 不过是英文的,不然你可以百度一下rpm就知道了额!!! 下面我帮你贴几个!!!!rpm 常用命令1.安装一个包 # ...

  3. chrome调试文章

    http://blog.csdn.net/a6225301/article/details/20207191#t1 http://www.360doc.com/content/13/1220/11/8 ...

  4. ASP.NET MVC使用Bootstrap系列(1)——开始使用Bootstrap

    阅读目录 Bootstrap结构介绍 在ASP.NET MVC 项目中添加Bootstrap文件 为网站创建Layout布局页 使用捆绑打包和压缩来提升网站性能 在Bootstrap项目中使用捆绑打包 ...

  5. php概率算法(转)

    这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...

  6. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  7. strtoull函数的使用,及相关信息汇总

    kafka中涉及到序列化,有一个参数是在发送消息实体前边以一个序列号打头, seq = strtoull((prdcfgval+1), NULL, 10); do_seq = 1; 其中(prdcfg ...

  8. jQuery.imgLazyLoad图片懒加载组件

    一.前言 当一个页面中请求的图片过多,而且图片太大,页面访问的速度是非常慢的,对用户的体验非常不友好:使用图片懒加载,可以减轻服务器的压力,增加页面的访问量,这里主要是总结一下我自己写的图片懒加载组件 ...

  9. 江湖救急:webbrowser中js文件丢失问题~

    页面中,有一个按钮,点击按钮通过js create 了一个 script标签 ,链接加载一个外部js文件,执行该js文件 $("#a").click(function(){ $.g ...

  10. mybatis 基础1(动态代理)

    我目前使用的是mybatis 3.3.0版本. 可使用 1.xml文本, 2.dao类, 3.sqlSession.getMapper(Class<T> type), 生成sql类, 原理 ...