Anagrams

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值