Anagrams

来源:互联网 发布:java 可视化 编辑:程序博客网 时间:2024/05/16 09:51

问题描述

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;    }}
0 0