code32 删词游戏

156 阅读1分钟

删词游戏

  • 给定一个全是小写字母的字符串str,删除多余字符,使得每种字符只保留一个,并让 最终结果字符串的字典序最小,返回这个字符串
  • [举例】
  • str ="acbc”,删掉第一个c,得到"abc",是所有结果字符串中字典序最小的。
  • str ="dbcacbca",删掉第一个'b、第一个c、第二个'c 第二个'a,得到"dabc",是所有结 果字符串中字典序最小的。

思路:

    1. 统计所有的字符出现的词频
    1. 从前往后遍历 -> 碰见一个字符,词频减1, 找到第一个词频减为0的字符的位置 index
    1. 从 [0…index] 中挑选一个字典序最小的字符,minIndex
    1. 从minIndex -> str.length 中删除掉这个 字符串
    1. 递归 [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; i < str.length; i++) {
11            map[str[i]]++;
12        }
13        int firstIndex = 0;
14        for (int i = 0; i < str.length; i++) {
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}