力扣练习题
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;
以上是关于力扣练习题的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):递归类:面试题 08.06. 汉诺塔问题:在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序