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); } /** * 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.keySet().contains(s.charAt(j))){ rightMap.put(s.charAt(j), j); } } ArrayList<Integer> list = new ArrayList<Integer>(); 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; } }