• LeetCode——删除字符串中的所有相邻重复项 II


    Q:给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。
    你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。
    在执行完所有删除操作后,返回最终得到的字符串。
    本题答案保证唯一。

    示例 1:
    输入:s = "abcd", k = 2
    输出:"abcd"
    解释:没有要删除的内容。
    示例 2:
    输入:s = "deeedbbcccbdaa", k = 3
    输出:"aa"
    解释:
    先删除 "eee" 和 "ccc",得到 "ddbbbdaa"
    再删除 "bbb",得到 "dddaa"
    最后删除 "ddd",得到 "aa"
    示例 3:
    输入:s = "pbbcggttciiippooaais", k = 2
    输出:"ps"

    A:

    1. 暴力解:
    public String removeDuplicates(String s, int k) {
            while (s.length() >= k) {
                boolean flag = true;
                StringBuilder sub = new StringBuilder();
                for (int i = 0; i < s.length(); i++) {
                    if (i + k <= s.length()) {
                        int count = 1;
                        int curr = s.charAt(i);
                        for (int j = i + 1; j < i + k; j++) {
                            if (curr == s.charAt(j))
                                count++;
                            else
                                break;
                        }
                        if (count == k) {
                            flag = false;
                            i = i + k - 1;
                            continue;
                        }
                    }
                    sub.append(s.charAt(i));
                }
                s = sub.toString();
                if (flag)
                    break;
            }
            return s;
        }
    
    1. 栈:我用双栈做的,实际上用Pair更方便(我傻了……完全忘了pair)
        public String removeDuplicates(String s, int k) {
            if (s.length() < k)
                return s;
            Stack<Character> stack = new Stack<>();
            Stack<Integer> stack1 = new Stack<>();
            stack.add(s.charAt(0));
            stack1.add(1);
            for (int i = 1; i < s.length(); i++) {
                if (!stack.empty() && stack.peek() == s.charAt(i)) {
                    stack1.add(stack1.peek() + 1);
                } else
                    stack1.add(1);
                stack.add(s.charAt(i));
                if (stack1.peek() == k) {
                    for (int j = 0; j < k; j++) {
                        stack.pop();
                        stack1.pop();
                    }
                }
            }
            StringBuilder res = new StringBuilder();
            while (!stack.empty()) {
                res.insert(0, stack.pop());
            }
            return res.toString();
        }
    
  • 相关阅读:
    gsoap 学习 1-自己定义接口生成头文件
    arcgis for silverlight 鼠标点击地图获取当前经纬度
    远程桌面服务器和本机粘贴板共享
    开源ORM
    Memcached
    Visual Studio一些插件
    asp.net 中的事务
    (转载)轻量级表达式树解析框架Faller
    冒泡排序
    (转)理解POCO
  • 原文地址:https://www.cnblogs.com/xym4869/p/13416599.html
Copyright © 2020-2023  润新知