Loading...

Leetcode316去除重复字母

在这里插入图片描述

求解思路

构建大压小的单调栈。

建立词频表,统计字符串中每种字符出现的次数。

新字符入栈时,如果破坏了大压小的原则,看栈顶元素对应的字符在后面是否还有,如果有则栈顶元素出栈,新字符入栈;

如果栈里已有该字符,则直接跳过。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
	public static int MAXN = 26;
	public static int[] cnts = new int[MAXN];
	public static boolean[] enter = new boolean[MAXN];
	public static char[] stack = new char[MAXN];
	public static int r;

	public static String removeDuplicateLetters(String str){
		r=0;
		Arrays.fill(cnts, 0);
		Arrays.fill(enter, false);

		char[] s = str.toCharArray();
		for(char cha:s){
			cnts[cha-'a']++;
		}

		for(char cur:s){
			if(!enter[cur-'a']){
				while(r>0&&stack[r-1]>cur&&cnts[stack[r-1]-'a']>0){
					enter[stack[r-1]-'a']=false;
					r--;
				}
				stack[r++]=cur;
				enter[cur-'a']=true;
			}
			cnts[cur-'a']--;
		}
		return String.valueOf(stack,0,r);
	}
Code Road Record