模拟笔试第二题:字符串分组

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);
        }
    }
}
全部评论
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; } } } 你这个flag遍历后保存的不是是最后一个V的比较值吗?只要最后一个不与当前的相同,就会加入集合。举个例子 3 abcd abcf abcd
点赞 回复 分享
发布于 2017-03-23 21:44
排个续,甩set里面,最后看下set的size
点赞 回复 分享
发布于 2017-03-23 21:25
public static void main(String[] args) { Scanner in = new Scanner(System.in); int m = in.nextInt(); Set<String> sets = new HashSet<String>(); in.nextLine(); for(int i = 0 ; i < m; ++i){ String str = in.nextLine(); char[] chs = str.toCharArray(); Arrays.sort(chs); sets.add(new String(chs)); } System.out.println(sets.size()); } 思路是一样的 但是我这个AC了
点赞 回复 分享
发布于 2017-03-24 10:16
#include <iostream> #include <string> #include <set> #include <algorithm> using namespace std; int main() { int n = 0; set<string> sset; cin >> n; string *s = new string[n]; for (int i = 0; i < n; ++i) { cin >> s[i]; sort(s[i].begin(), s[i].end()); sset.insert(s[i]); } cout << sset.size() << endl; return 0; } 这样可以不?
点赞 回复 分享
发布于 2017-03-23 21:20
我之前也考虑楼主这种 利用hashmap 来存储字符 但是有这种情况 可能会出现问题    字符串 aabc  和 bca 这种情况aabc在放入map中就会覆盖掉1个a   结果就是与bca判别成了同一类 自己感觉是这样的,我用的暴力便利在依次查重复,但是最后通过率还没有楼主高
点赞 回复 分享
发布于 2017-03-23 21:21
自我感觉很简洁的 import java.lang.reflect.Array; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class NiuKe2 { public static void main(String[] args) { Scanner in=new Scanner(System.in); Map<String, Integer> map=new HashMap<>(); int n=in.nextInt(); String[] tem=new String[n]; int count=0; for(int i=0;i<n;i++){ tem[i]=in.next(); char[] a=tem[i].toCharArray(); Arrays.sort(a); if(!map.containsKey(String.copyValueOf(a))){ map.put(String.copyValueOf(a), 1); count++; } } System.out.println(count); } }
点赞 回复 分享
发布于 2017-03-23 21:27
Python写法: N = int(raw_input()) strings = [] for i in range(N): strings.append(raw_input()) # 将字符串“标准化”;“标准化”结果相同的字符串即为“同类别” def normalize(string): # 把字符串打散成单个字符 chars_in_the_string = [s for s in string] # 对这些字符排序 chars_in_the_string.sort() # 重组为“标准化”的字符串 return ''.join(chars_in_the_string) norms = set() for string in strings: nomrs.add(normalize(string)) print len(norms)
点赞 回复 分享
发布于 2017-03-23 21:27
事实上你直接把输入的字符串【字符打散、重新排序】,就可以得到表示字符串类别的【特征值】,对这个【特征值】用set就可以了。
点赞 回复 分享
发布于 2017-03-23 21:32
实在不行,你跑一下最小表示法,
点赞 回复 分享
发布于 2017-03-23 22:24
我是算字符串中字符asc码的乘积res,然后将res和个数组成字符串,扔set里面,就通过了。
点赞 回复 分享
发布于 2017-03-24 11:11
你这个复杂化了,没那么复杂,直接一个HashMap就可以
点赞 回复 分享
发布于 2017-03-25 10:05

相关推荐

秋招之BrianGriffin:你再跟他说华为工资也低(相对互联网)就可以享受私信爆炸了😋
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务