leetcode 第140场周赛

https://leetcode.com/contest/weekly-contest-140

前三个题就不贴代码了,看这里:https://leetcode.com/contest/weekly-contest-140/ranking

A:暴力

B:dfs

C:dfs

D:题意:给了一个字符串,让你选一个子序列包含所有的字符,且字典序最小

使用单调栈

首先预处理出26个小写字母最后一次出现的位置

每来一个新字符,如果这个字符比栈顶元素小,且不在栈中,且栈顶元素在后面还有,那么出栈。

import java.util.Stack;

/**
 * Created by dezhonger on 2019/6/15
 */
public class Leetcode1081 {
    public String smallestSubsequence(String text) {
        Stack stack = new Stack<>();
        int[] lastIndex = new int[26];
        int[] v = new int[26];
        for (int i = 0; i < text.length(); i++) {
            lastIndex[text.charAt(i) - 'a'] = i;
        }
        for (int i = 0; i < text.length(); i++) {
            while (!stack.isEmpty() && v[text.charAt(i) - 'a'] == 0 && text.charAt(i) < text.charAt(stack.peek()) && lastIndex[text.charAt(stack.peek()) - 'a'] > i) {
                v[text.charAt(stack.peek()) - 'a'] = 0;
                stack.pop();
            }
            if (v[text.charAt(i) - 'a'] == 0) {
                stack.push(i);
                v[text.charAt(i) - 'a'] = 1;
            }

        }
        StringBuilder sb = new StringBuilder();
        while (!stack.empty()) {
            sb.append(text.charAt(stack.pop()));
        }
        return sb.reverse().toString();
    }
}

 

你可能感兴趣的:(比赛,leetcode)