[LeetCode][Java] Anagrams

题目:

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

Note: All inputs will be in lower-case.

题意:

给定一个字符串数组,返回所有的易位构词组合。

注意:所有的输入都是小写。


算法分析:

易位构词其实也很好理解,就是两个单词所包含的字符和数量都是一样的,只是顺序不同

对字符串中各字母进行排序,那么互为重排列的字符串就会相等。

按照上述思路,用一个map纪录按字母排序后的字符串及其出现位置(或原字符串),在遍历过程中,如果遇到排序后的字符串相等的,就说明两者互为重排列。

第一次出现的重排列字符串需要特殊照顾下,下述代码中用-1标识第一次出现的重排列字符串是否已经加入结果。

此外,对字符串按字母排序的方法可以用Java类库的char数组排序;也可以利用题目所说的字符串中只含有小写字母这一信息,进行计数排序


AC代码:

	  public ArrayList<String> anagrams(String[] strs) 
	  {
		    ArrayList<String> list = new ArrayList<String>();
		    HashMap<String, Integer> map = new HashMap<String, Integer>();
		    
		    for (int i = 0; i < strs.length; ++i) 
		    {
		      char[] chars = strs[i].toCharArray();
		      
		      Arrays.sort(chars);
		      
		      String anagram = new String(chars);
		      
		      if (map.containsKey(anagram)) 
		      {
		        int index = map.get(anagram);
		        if (index != -1)
		        {
		          list.add(strs[index]);
		          map.put(anagram, -1);//用-1标识第一次出现的重排列字符串
		        }
		        list.add(strs[i]);
		      } 
		      else 
		        map.put(anagram, i);
	
		    }
		    return list;
	   }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值