字母异位分词分组

package arrayandstring;

import java.util.*;

public class GroupAnagrams {
    public static void main(String[] args) {
        String[] strs = new String[] {"eat", "tea", "tan", "ate", "nat", "bat"};
        GroupAnagrams groupAnagrams = new GroupAnagrams();
        List<List<String>> res = groupAnagrams.groupAnagrams(strs);
        for(List<String> list : res){
            System.out.println(list);
        }

    }

    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();

        int strNum = strs.length;
        int [] visited = new int[strNum];

        for (int i = 0; i < strNum; i ++) {
            if (visited[i] == 0) {
                List<String> list = new ArrayList<>();
                String s = strs[i];
                list.add(s);
                for (int j = i + 1; j < strNum; j ++) {
                    if (visited[j] == 0 && judge(s,strs[j])) {
                        list.add(strs[j]);
                        visited[j] = 1;
                    }
                }

                res.add(list);
            }
        }

        return res;
    }

    public boolean judge(String s, String y) {
        if (s.length() != y.length()) {
            return false;
        }
        char[] ch1 = s.toCharArray();
        char[] ch2 = y.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);

        return Arrays.equals(ch1, ch2);
    }

    //将上述思路整理
    public List<List<String>> groupAnagrams02(String[] strs) {
        if (strs.length == 0) {
            return new ArrayList<>();
        }

        Map<String, List<String>> map = new HashMap<>();

        for (String s : strs) {
            char [] ch = s.toCharArray();
            Arrays.sort(ch);

            String key = String.valueOf(ch);
            if (!map.containsKey(key)) {
                map.put(key,new ArrayList<>());
            }
            map.get(key).add(s);
        }

        return new ArrayList<>(map.values());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值