删词游戏
- 给定一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并让 最终结果字符串的字典序最小,返回这个字符串
- [举例】
- str ="acbc”,删掉第一个c,得到"abc",是所有结果字符串中字典序最小的。
- str ="dbcacbca",删掉第一个'b、第一个c、第二个'c 第二个'a,得到"dabc",是所有结 果字符串中字典序最小的。
思路:
-
- 统计所有的字符出现的词频
-
- 从前往后遍历 -> 碰见一个字符,词频减1, 找到第一个词频减为0的字符的位置 index
-
- 从 [0…index] 中挑选一个字典序最小的字符,minIndex
-
- 从minIndex -> str.length 中删除掉这个 字符串
-
- 递归 [minIndex + 1…..str.length]
时间复杂度:
- 如果字符串的种类是K种, O(k*n) 也就是O(n)
code
1public class Code32 {
2
3 public static String removeStr(String s) {
4 if (s == null || s.length() <= 0) {
5 return ""
6 }
7 int[] map = new int[256]
8 char[] str = s.toCharArray()
9 // 统计词频
10 for (int i = 0
11 map[str[i]]++
12 }
13 int firstIndex = 0
14 for (int i = 0
15 firstIndex = str[i] < str[firstIndex] ? i : firstIndex
16 if (--map[str[i]] == 0) {
17 break
18 }
19 }
20 return str[firstIndex] + removeStr(s.substring(firstIndex + 1).replaceAll(String.valueOf(str[firstIndex]), ""))
21 }
22
23 public static void main(String[] args) {
24 System.out.println(removeStr("acbc"))
25 System.out.println(removeStr("dbcacbca"))
26 }
27}