力扣练习题

Posted *平芜尽处是春山*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣练习题相关的知识,希望对你有一定的参考价值。

每日一练

力扣1209. 删除字符串中的所有相邻重复项 II

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

class Solution 
    public String removeDuplicates(String s, int k) 
        int N = s.length();
        if(N == 1) return s;
        StringBuilder sb = new StringBuilder(s);
        int[] count = new int[N];
        for(int i = 0 ; i < sb.length(); ++i) 
            if(i == 0 || sb.charAt(i) != sb.charAt(i - 1)) 
                count[i] = 1;
             else 
                count[i] = count[i - 1] + 1 ;
                if((count[i] == k)) 
                    sb.delete(i - k + 1,i + 1);
                    i = i - k;
                
            
        
        return sb.toString();
    

力扣1047. 删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

class Solution 
    public String removeDuplicates(String s) 
        StringBuffer stack = new StringBuffer();
        int top = - 1;
        for(int i = 0 ; i < s.length(); ++i) 
            char ch = s.charAt(i);
            if(top >= 0 && stack.charAt(top) == ch) 
                stack.deleteCharAt(top);
                --top;
             else 
                stack.append(ch);
                ++top;
            
        
        return stack.toString();
    

力扣76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

class Solution 
    Map<Character, Integer> ori = new HashMap<Character, Integer>();
    Map<Character, Integer> cnt = new HashMap<Character, Integer>();

    public String minWindow(String s, String t) 
        int tLen = t.length();
        for (int i = 0; i < tLen; i++) 
            char c = t.charAt(i);
            ori.put(c, ori.getOrDefault(c, 0) + 1);
        
        int l = 0, r = -1;
        int len = Integer.MAX_VALUE, ansL = -1, ansR = -1;
        int sLen = s.length();
        while (r < sLen) 
            ++r;
            if (r < sLen && ori.containsKey(s.charAt(r))) 
                cnt.put(s.charAt(r), cnt.getOrDefault(s.charAt(r), 0) + 1);
            
            while (check() && l <= r) 
                if (r - l + 1 < len) 
                    len = r - l + 1;
                    ansL = l;
                    ansR = l + len;
                
                if (ori.containsKey(s.charAt(l))) 
                    cnt.put(s.charAt(l), cnt.getOrDefault(s.charAt(l), 0) - 1);
                
                ++l;
            
        
        return ansL == -1 ? "" : s.substring(ansL, ansR);
    

    public boolean check() 
        Iterator iter = ori.entrySet().iterator(); 
        while (iter.hasNext())  
            Map.Entry entry = (Map.Entry) iter.next(); 
            Character key = (Character) entry.getKey(); 
            Integer val = (Integer) entry.getValue(); 
            if (cnt.getOrDefault(key, 0) < val) 
                return false;
            
         
        return true;
    


这里写目录标题

剑指 Offer II 039. 直方图最大矩形面积

给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

class Solution 
    public int largestRectangleArea(int[] heights) 
        int n = heights.length;
        int[] left = new int[n];
        int[] right = new int[n];
        
        Deque<Integer> mono_stack = new ArrayDeque<Integer>();
        for (int i = 0; i < n; ++i) 
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) 
                mono_stack.pop();
            
            left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek());
            mono_stack.push(i);
        

        mono_stack.clear();
        for (int i = n - 1; i >= 0; --i) 
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) 
                mono_stack.pop();
            
            right[i] = (mono_stack.isEmpty() ? n : mono_stack.peek());
            mono_stack.push(i);
        
        
        int ans = 0;
        for (int i = 0; i < n; ++i) 
            ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);
        
        return ans;
    

以上是关于力扣练习题的主要内容,如果未能解决你的问题,请参考以下文章

力扣84.柱状图中最大的矩形及单调栈介绍和用法总结

力扣84.柱状图中最大的矩形及单调栈介绍和用法总结

Leetcode练习(Python):递归类:面试题 08.06. 汉诺塔问题:在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序

GEEK编程练习— —雨水存储问题

精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解

力扣练习题