Remove Duplicate Letters

2020-01-19 13:18:11

问题描述

Remove Duplicate Letters_第1张图片

问题求解

本题是要求挑选出一个字符串的子序列,并且保证得到的子序列中能够有所有出现的字符且其字典序最小。

最容易想到的解法就是dfs了,暴力去进行检索,并生成所有的满足条件的子序列,最后从中得到字典序最小的那个。可惜使用这种算法的结果是tle。

第二个思路是用map将所有的idx保存下来,之后进行二分检索,但是这个时间复杂度也非常高。

最优的解法是使用count数组和visited数组来对字符进行统计,如果当前的字符已经出现过,那么直接pass,因为越前出现越好;如果当前的字符并没有出现,并且前面的字符比他大,而且其count大于0,那么前面的字符就可以弹出。

    public String removeDuplicateLetters(String s) {
        char[] chs = s.toCharArray();
        int[] count = new int[127];
        int[] used = new int[127];
        for (int i = 0; i < chs.length; i++) {
            count[chs[i]] += 1;
        }
        Stack stack = new Stack<>();
        for (int i = 0; i < chs.length; i++) {
            char c = chs[i];
            count[c] -= 1;
            if (used[c] == 1) continue;
            while (!stack.isEmpty()) {
                char temp = stack.peek();
                if (temp > c && count[temp] > 0) {
                    stack.pop();
                    used[temp] = 0;
                }
                else break;
            }
            used[c] = 1;
            stack.push(c);
        }
        StringBuffer sb = new StringBuffer();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        sb.reverse();
        return sb.toString();
    }

  

你可能感兴趣的:(Remove Duplicate Letters)