import java.util.*; /** * NC355 划分字母区间 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型ArrayList */ public ArrayList<Integer> splitString (String s) { // return solution1(s); // return solution2(s); // return solution3(s); return solution4(s); } /** * Single HashMap * @param s * @return */ private ArrayList<Integer> solution1(String s){ HashMap<Character, Integer> rightMap = new HashMap<>(); int len = s.length(); for(int i=0,j=len-1; i<len&&j>=0; i++,j--){ if(!rightMap.containsKey(s.charAt(j))){ rightMap.put(s.charAt(j), j); } } ArrayList<Integer> list = new ArrayList<>(); // 双指针 int left=0,right=0; char ch; for(int i=0; i<len; i++){ ch = s.charAt(i); // 贪心 关键! right = Math.max(right, rightMap.get(ch)); if(i == right){ list.add(right-left+1); left = i+1; } } return list; } // /** // * Double HashMap // * @param s // * @return // */ // private ArrayList<Integer> solution2(String s){ // HashMap<Character, Integer> leftMap = new HashMap<>(); // HashMap<Character, Integer> rightMap = new HashMap<>(); // int len = s.length(); // for(int i=0,j=len-1; i<len&&j>=0; i++,j--){ // if(!leftMap.keySet().contains(s.charAt(i))){ // leftMap.put(s.charAt(i), i); // } // if(!rightMap.keySet().contains(s.charAt(j))){ // rightMap.put(s.charAt(j), j); // } // } // ArrayList<Integer> list = new ArrayList<Integer>(); // int left,right; // HashSet<Character> set = new HashSet<>(); // char ch; // for(int i=0; i<len; ){ // ch = s.charAt(i); // if(!set.contains(ch)){ // set.add(ch); // left = leftMap.get(ch); // right = rightMap.get(ch); // if(left == right){ // list.add(1); // }else{ // for(int j=left+1; j<right; j++){ // ch = s.charAt(j); // if(!set.contains(ch)){ // set.add(ch); // right = Math.max(right, rightMap.get(ch)); // } // } // list.add(right-left+1); // } // i = right+1; // }else{ // i++; // } // } // return list; // } ////////////////////////////////////////////////////////////////////////// /** * 贪心+双指针+字符串 * @param s * @return */ private ArrayList<Integer> solution3(String s){ int n = s.length(); ArrayList<Integer> result = new ArrayList<>(); // 双指针 int left = 0; int right = 0; int pre = -1; while(left < n){ // 贪心 关键! right = Math.max(right, s.lastIndexOf(s.charAt(left))); if(left == right){ result.add(right-pre); pre = right; } left++; } return result; } /** * 贪心+双指针+哈希 * @param s * @return */ private ArrayList<Integer> solution4(String s){ int n = s.length(); // 哈希 字符:最右索引 HashMap<Character, Integer> rightIndexMap = new HashMap<>(); char ch; for(int i=n-1; i>=0; i--){ ch = s.charAt(i); if(!rightIndexMap.containsKey(ch)){ rightIndexMap.put(ch, i); } } ArrayList<Integer> result = new ArrayList<>(); // 双指针 int left = 0; int right = 0; for(int i=0; i<n; i++){ ch = s.charAt(i); // 贪心 关键! right = Math.max(right, rightIndexMap.get(ch)); if(i == right){ result.add(right-left+1); left = i+1; } } return result; } }