Anagrams

问题描述

Given an array of strings, return all groups of strings that are anagrams.
即回文构词法
For example:
Input:  [“tea”,”and”,”ate”,”eat”,”den”]
Output: [“tea”,”ate”,”eat”]

思考:怎么才能把一个单词的各个字母不按顺序比较

想法1: 排序

  • 把str转换成char[],然后排序,利用已排序的char[],生成新的newStr,设置为key;
  • 把key和原str放到oriMap中,并记录返回值。
  • 如果map的返回值不为空,则表示之前存有相同key的value,放入result中(map的put会返回旧的value值),并将key和新value放入pairMap中(记录最后一次具有相同key的str);

想法2: 哈希表

  • 但是哈希表比较难支持重复字母

想法3:利用数组当作key

基本与想法一一致,不过用int[26]计算str中每个单词出现的次数。
代码省略

代码:

想法一:

public class Solution {
    public List<String> anagrams(String[] strs) {
        Map<String, String> ori = new HashMap<>();
        List<String> list = new LinkedList<>();
        Map<String, String> pair = new HashMap<>();

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

            String key = new String(chs);
            String oriStr = ori.put(key, str);

            if(oriStr != null){
                list.add(oriStr);
                pair.put(key,str);        //只保留最后一个;
            }
        }
        list.addAll(pair.values());
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值