• 1255 字典序最小的子序列(贪心)


    1255 字典序最小的子序列
    1 秒 131,072 KB 40 分 4 级题

    思路:

    创建一个标记数组标记是否在栈中
    创建一个数量数组,标记字符个数

    维护一个栈,循环字符串

    • 当栈顶>当前字符 && 栈顶字符后面还会出现,那么 替换字符
    • 当前字符没有加入到栈中,直接加入
    • 如果栈顶和当前元素一致,个数-1

    在每个操作中,都会有解除/添加标记,数量-1的操作

    代码:

    package _51_node.greedy;
    
    import java.util.Scanner;
    import java.util.Stack;
    
    public class ex_1255 {
        /**
         * 1255 字典序最小的子序列
         * 1 秒  131,072 KB 40 分 4 级题
         *
         * 维护一个栈,3种操作,
         * 1、如果栈顶ch1 > 输入字母ch2,并且ch1后面还出现,并且栈里没有ch2,则加入栈
         * 2、如果栈里没有这个字母,那么入栈
         * 3、如果相同,或者已经在栈里,不入栈
         * @param args
         */
        public static void main(String[] args) {
            Scanner cin = new Scanner(System.in);
            String str = cin.nextLine();
            int[] arr = new int[26];
            int[] bool = new int[26];
            for (int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);
                arr[ch - 'a']++;
                bool[ch - 'a'] = 0;
            }
            Stack<Character> stack = new Stack<>();
            stack.push(str.charAt(0));
            arr[str.charAt(0) - 'a']--;
            bool[str.charAt(0) - 'a'] = 1;
            for (int i = 1; i < str.length(); i++) {
                char ch1 = stack.peek();
                char ch2 = str.charAt(i);
                if (arr[ch1 - 'a'] >= 1 && ch2 < ch1 && bool[ch2 - 'a'] == 0) {
                    stack.pop();
                    bool[ch1 - 'a'] = 0;
                    while(!stack.empty()) {
                        ch1 = stack.peek();
                        if(ch1 > ch2 && arr[ch1 - 'a'] >= 1 ) {
                            stack.pop();
                            bool[ch1 - 'a'] = 0;
                        }else break;
                    }
                    stack.push(ch2);
                    bool[ch2 - 'a'] = 1;
                    arr[ch2 - 'a']--;
                }else if(bool[ch2 - 'a'] == 0) {
                    bool[ch2 - 'a'] = 1;
                    stack.push(ch2);
                    arr[ch2-'a']--;
                }else if (ch1 == ch2 || bool[ch2 - 'a'] == 1) {
                    arr[ch2 - 'a']--;
                }
            }
            String s = "";
            while (!stack.empty()) {
                s += stack.pop();
            }
            System.out.println(new StringBuilder(s).reverse().toString());
        }
    }
    
    
  • 相关阅读:
    selfhacking第六天
    Emacshacking第二天
    有符号数和无符号数在计算机中的存储方式以及在Verilog中的运用($signed函数)
    网络资源
    Asp.Net MVC 之 Autofac 初步使用1
    Asp.Net MVC 之 Autofac 初步使用3 集成web api
    Silverligth API for ArcGIS应用程序IIS发布
    WebContent的红色小叉
    [转载]2229岁的人怎么工作?
    Flex+Java 开发环境部署之一:JDK
  • 原文地址:https://www.cnblogs.com/somliy/p/10018585.html
Copyright © 2020-2023  润新知