暑期考核算法题-2


title: 暑期考核算法题-2
date: 2020-07-15 10:41:23
tags:

  • 算法
    categories:
  • java
  • 算法

暑期考核算法题-2

题目:

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

题目链接:

题目

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

链接:https://leetcode-cn.com/problems/group-anagrams

解题思路:

1.定义一个Map集合-

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

2.key存排序后的字符串,value存与key排序后相同的字符串集合

3.从第一个字符串开始,每次先排序后判断key里面是否包含,如果包含将原字符串添加到value的List集合中,如果没有创建一个List并将新创建的List集合和此时key里没有的字符串加入到Map集合中-

List<String> list1=new ArrayList<>();
map.put(s,list1);
list1.add(strs[i]);

4.重复第三步,直至所有都加入到Map集合中

5.将Map集合中的value集合加入到result集合中-

List<List<String>> result=new ArrayList<>();
for ( List<String> list:map.values()) {
            result.add(list);
        }

算法源代码

package com.company;

import java.util.*;

/**
 * @author peichendong
 */
public class Test02 {
    public static void main(String[] args) {

        String[] strings={"eat","tea","tan","ate","nat","bat"};

        List<List<String>> result=new ArrayList<>();
        result=new Test02().groupAnagrams(strings);

        for (List<String> list:result) {
            System.out.println(list.toString());
        }
    }

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

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

        for (int i = 0; i < strs.length; i++) {
            char[] chars=strs[i].toCharArray();
            Arrays.sort(chars);
            String s=String.valueOf(chars);

            if (map.containsKey(s)){
                List<String> list=map.get(s);
                list.add(strs[i]);
            }else {
                List<String> list1=new ArrayList<>();
                map.put(s,list1);
                list1.add(strs[i]);
            }
        }

        for ( List<String> list:map.values()) {
            result.add(list);
        }

        return result;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值