模拟笔试第二题:字符串分组
PS: sort完set这个方法是可行的
代码:
public static void main(String[] args){Scanner in = new Scanner(System.in);while (in.hasNext()){int n = in.nextInt();HashSet<String> SS = new HashSet<>();for (int i = 0; i < n; i++) {char[] chars = in.next().toCharArray();Arrays.sort(chars);SS.add(new String(chars));}System.out.println(SS.size());}}
但我想问的是下面的方法错在哪里谢谢
-------原帖------
第二题字符串分组,一直AC 90%,求指导下哪边漏了
基本思路,用HashMap统计字符串中每个字符出现次数,然后以 字符串长度+唯一字符个数
拼接作为key,建立个HashMap,value是ArrayList,用来放字符分布情况的统计HashMap;新字符串先统计各个字符出现情况,然后以
字符串长度+唯一字符个数 作为key找到对应的字符分布情况的list,然后遍历判断当前字符串的字符分布情况是否已经存在。
代码:
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); Map<String, List<Map<Character, Integer>>> dicts = new HashMap<>(); int group = 0; for (int i = 0; i < n; i++) { String ss = in.next(); int sl = ss.length(); // 统计当前字符串的字符出现情况 Map<Character, Integer> c_n = new HashMap<>(); for (int j = 0; j < sl; j++) { char c = ss.charAt(j); if (c_n.containsKey(c)) c_n.put(c, c_n.get(c)+1); else c_n.put(c, 1); } String k = sl+""+c_n.size(); if (dicts.containsKey(k)){ boolean flag = true; List<Map<Character, Integer>> vl = dicts.get(k); // 判断当前字符串的字符分布是否已经存在 for (Map<Character, Integer> v: vl) { flag = true; for (char c:v.keySet()) { if (!c_n.containsKey(c) || v.get(c) != c_n.get(c)){ flag = false; break; } } } if (!flag){ group += 1; dicts.get(k).add(c_n); } }else { group += 1; dicts.put(k, new ArrayList<>(Collections.singletonList(c_n))); } } System.out.println(group); } } }