remove duplicate letters

来源:互联网 发布:如何上传转录组数据库 编辑:程序博客网 时间:2024/05/22 16:52

leetcode 316 Remove Duplicate Letters


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”


我的想法

我的想法是既然要删除字符串中所有的字符,那我们不如做一个hash表,这样我们可以记录每个字符的次数,想做到去重是很简单的,但是呢如何让其呈现字典序呢?一开始我比较天真,因为题目中说要按照字典序,我理解错题意了,我直接构造了一个字典,然后在字典中去找只出现一次的,结果当然是错的,比如第二个测试用例,它会返回abcd

public String removeDuplicateLetters(String s) {    String result = "";    String temp = "abcdefghijklmnopqrstuvwxyz";    int []flag = new int[256];    for (int i = 0;i < s.length();i++) {        flag[s.charAt(i)]++;    }    for (int i = 0 ;i < temp.length(); i++) {        if (flag[temp.charAt(i)] >= 1) {            result += temp.charAt(i);        }    }    return result;}

当然这种方法肯定是不合适的。

七月算法在线算法

曹老师提供了两种方法,说时候第一种方法有点绕,我都没怎么懂,第二种方法相对就比较懂一些,就是利用了栈的思想,我们把我的最终结果字符进行压栈处理,在每次进栈的时候呢,我们需要将栈中的一些元素弹出,其符合两个条件:

  1. 栈中的元素比这个元素大
  2. 栈中的元素不是其出现的最后一个元素。

按照这种思路我们得到下面的算法。

public String removeDuplicateLetters(String s) {    int []num = new int[26];    boolean []in = new boolean[26];    String result = "";    Stack<Character> stack = new Stack<Character>();        for (int i = 0; i < s.length();i++) {        num[s.charAt(i) - 'a']++;    }    for (int i = 0; i < s.length();i++) {        char c = s.charAt(i);        num[c - 'a']--;//注意这里的num里存放的是i这个位置其更靠右的位置出现了多少次,因为我们在进行//          弹栈的时候就是想看看其后面有没有和其一样的了,这一点很重要。        //if (!in[c - 'a']) {            while (!stack.isEmpty() && stack.peek() > c && num[stack.peek() - 'a'] > 0) {                in[stack.peek() - 'a'] = false;                stack.pop();                }            stack.push(c);            in[c - 'a'] = true;        //}    }    while (!stack.isEmpty()) {        result = stack.pop() + result;    }    return result;}

注意这里并没有加入判断每个字符是否在最终的结果中出现,结果会出现一点问题,就是最后一个字符无法进行判断,所以我们还应该将每个字符的存在性也进行散列。就是把上述代码中的注释去掉就可以。

0 0
原创粉丝点击