星空网 > 软件开发 > Java

316. Remove Duplicate Letters

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"

解题思路:

abccdab

第一步:字母去重abcdab

第二步:map中存放{d=3, b=5, c=2, a=4}

第三步:拼接输出

原理:第一个元素一定会出现在0到2之间(因为字符串中最后一次出现c的位置为2,如果0到2之间没有出现一个元素,那么拼接的字符串将不会有c这个字符)

   0到2之间一定会出现角标为2处的元素大于1次,并且角标为2处的元素为当前拼接的字符串中最大的。

根据这个原理来控制b与end的值并且选择(b,end]中最小的元素,拼接字符串。

 1 public class Solution { 2   public String removeDuplicateLetters(String s) { 3     // 字母去重 4     Character old=null; 5     Character newc; 6     StringBuilder stb = new StringBuilder(); 7     for (int i = 0; i < s.length(); i++) { 8       newc = s.charAt(i); 9       if (old!=newc) {10         stb.append(newc);11       }12       old = newc;13     }14     s = stb.toString();15     16     // 利用map的自动覆盖得到最后出现的字母角标键值对17     Map<Character,Integer> map = new HashMap<Character,Integer>();18     for (int i = 0; i < s.length(); i++) {19       map.put(s.charAt(i), i);20     }21     int len = map.size();22     23     // 利用StringBuilder来拼接输出24     StringBuilder sb = new StringBuilder();25     int b=0;26     int end = findMinValue(map);27     Character val = findKeyByValue(map,end);28     while (sb.length()<len) {29       Character minc='z'+1;30       for (int i = b; i <= end; i++) {31         Character cm = s.charAt(i);32         if (cm<minc&&cm<=val&&map.containsKey(cm)) {33           minc = cm;34           b=i+1;35         }36       }37       sb.append(minc+"");38       // 从map中删除39       map.remove(minc);40       if(minc == val){41         end = findMinValue(map);42         val = findKeyByValue(map,end);43       }44     }45     46     47     return sb.toString();48   }49   public Character findKeyByValue(Map<Character,Integer> map,int val){50     for (Map.Entry<Character,Integer> entry: map.entrySet()) {51       if (entry.getValue()==val) {52         return entry.getKey();53       }54     }55     return null;56   }57   public int findMinValue(Map<Character,Integer> map){58     int minkey = Integer.MAX_VALUE;59     for (Integer index : map.values()) {60       if (index<minkey) {61         minkey = index;62       }63     }64     return minkey;65   }66 }

此题的关键在于第30行代码处:对每一个将要输出的字母范围进行限制。




原标题:316. Remove Duplicate Letters

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

fba物流是啥:https://www.goluckyvip.com/tag/20138.html
fba物流是什么:https://www.goluckyvip.com/tag/20139.html
出海新西兰:https://www.goluckyvip.com/tag/2014.html
fba物流收费标准:https://www.goluckyvip.com/tag/20140.html
fba物流特点:https://www.goluckyvip.com/tag/20141.html
fba物流头程:https://www.goluckyvip.com/tag/20142.html
月活用户超20亿!万亿市值巨头对中国商家进一步开闸放流 :https://www.kjdsnews.com/a/1836412.html
九寨沟周围必去的景点推荐:https://www.vstour.cn/a/363190.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流