本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42744709

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

Note: All inputs will be in lower-case.

思路:

(1)如果不知道anagrams的意思,很容易将题意理解错了。最开始我理解的意思是求给定字符串数组的全排列有多少种。OJ几次都错了,后来被迫查了下anagrams的意思才知道,anagrams:由颠倒字母顺序而构成的字[短语]。看来英语还是要学好啊。该题意为给定一个字符串数组,求得该数组中所有由相同字符组成的字符串序列。例如:给定字符串数组["abc","acb","cab","xyz","fg"],则结果为["abc","acb","cab"]。

(2)本文主要运用Map来存储,其中Key为经过排序后的字符串(通过对字符串进行排序,能够将顺序打乱的字符串变得相同),value为打乱顺序的一系列字符串。上例中key为"abc",value为["abc","acb","cab"]。然后通过判断Map中value对应List中元素个数是否大于1,如果大于1,说明有多个由相同字符组成但是顺序被打乱的字符串。

(3)详见下方代码。希望对你有所帮助。(PS:其中Arrays.sort()方法是对给定的数组进行排序)

算法代码实现如下:

/**
 *
 * @author liqq
 */
public static List<String> anagrams(String[] strs) {
	if (strs == null || strs.length < 2)
		return new ArrayList<String>();
	Map<String, List<String>> maps = new HashMap<String, List<String>>();
	for (String str : strs) {
		char[] arr = str.toCharArray();
		Arrays.sort(arr);
		String key = new String(arr);
		if (!maps.containsKey(key)) {
			maps.put(key, new ArrayList<String>());
		}
		List<String> list = maps.get(key);
		list.add(new String(str));
	}

	List<String> result = new ArrayList<String>();
	for (Iterator<String> iterator = maps.keySet().iterator(); iterator
			.hasNext();) {
		String key = iterator.next();
		if (maps.get(key).size() > 1) {
			result.addAll(maps.get(key));
		}
	}
	return result;
}

Leetcode_49_Anagrams的更多相关文章

随机推荐

  1. Unity3D各平台Application.xxxPath的路径

    前几天我们游戏在一个同事的Android手机上启动时无法正常进入,经查发现Application.temporaryCachePath和Application.persistentDataPath返回 ...

  2. 安卓高级EventBus使用详解

    我本来想写但是在网上看了下感觉写得不如此作者写得好:http://www.jianshu.com/p/da9e193e8b03 前言:EventBus出来已经有一段时间了,github上面也有很多开源 ...

  3. PHP学习(1)——我为什么要学PHP

    PHP简介 PHP是一种服务器端的脚本语言,特别适合做web开发.高效.灵活.实用是PHP的特点.PHP最开始是Personal Home Page的缩写,后来正式更名为了"PHP:Hype ...

  4. 代码优化>>>Android ListView适配器三级优化详解

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接  http://blog.csdn.net/qq_32059827/article/details/52718489 ...

  5. Java基本语法-----java运算符的优先级与结合性

    这是本人以前的上学期间java 运算符这块知识的总结的,截图存到了word里,大家将就看下吧(不会用Markdown的表格 不然就在写一遍了 T T). [正在看本人博客的这位童鞋,我看你气度不凡,谈 ...

  6. Git 解决一个电脑多用户情况(win7)

    首先:在输入ssh-keygen -t rsa -C "注册邮箱"后不要急着按enter,此时输入秘钥对的文件名,不要跟默认文件重名(默认的是id_rsa) 划红线的地方就是新的文 ...

  7. 密码学Hash函数

    定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...

  8. Android JavascriptBridge 详解(二)

    原文出自:http://blog.csdn.net/sk719887916/article/details/47189607 Android开发目前现状来说,开发者大部分时间花在UI的屏幕适配上,使用 ...

  9. Java进阶(四十)Java类、变量、方法修饰符讲解

    Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...

  10. UNIX网络编程——基于UDP协议的网络程序

    一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include <sys/types.h> #include <sys/so ...