Anagrams

来源:互联网 发布:人工智能未来猜想 编辑:程序博客网 时间:2024/06/18 01:29

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.


首先简单介绍一下Anagram(回文构词法)。Anagrams是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。

回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。


题目的意思是给一个String数组,找出其中由相同字母组成的单词

例如:
S = ["abc", "bca", "bac", "bbb", "bbca", "abcb"]
答案为:
["abc", "bca", "bac", "bbca", "abcb"]

只有"bbb"没有相同字母组成的单词。


思路:既然是相同字母生成的单词,那对单词里的字母排序,必然得到相同的结果。利用HashMap将排序的结果作为键,将第一次出现的单词在strs[]数组中的下标作为值,那么当下一个相同字母构成的单词出现的时候,将键值对的值修改成-1,标志值已经有重复的出现了,并将前2个都添加都list集合中,以后再出现相同的,根据查到的键值对的值为-1,直接加入到list即可。对于新出现的别的单词,依照上述过程即可。


代码如下:

public class Solution {    public List<String> anagrams(String[] strs) {        if(strs==null||strs.length==0) return null;        List<String> list = new ArrayList<String>();        HashMap<String,Integer> map = new HashMap<String,Integer>();        for(int i=0;i<strs.length;i++) {            char[] temp = strs[i].toCharArray();            Arrays.sort(temp);            //将字母排序,作为识别的依据                     String str = new String(temp);                        if(map.containsKey(str)) {                int index=map.get(str);                if(index!=-1){              //第二次出现,便可以添加到list中了                    list.add(strs[index]);                    map.put(str,-1);                }                list.add(strs[i]);            }else{                map.put(str,i);          //第一次出现某种字母顺序的字符串,先放到map中保存,等待第二次的出现            }        }                return list;    }}


 
0 0
原创粉丝点击