Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2794756
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Java

2012-07-09 16:09:05

在一份文本文件中,查找其中所有的anagram。例如,如果这份文件中包含了stop、tops、pots这样三个单词,这三个词就是一组anagram,这三个单词都是由s、t、o、p这四个字母组成的。这份文件中可能存在多组anagram,大小写视为同样字符。在解答时,需要注意代码的效率、质量。当不能给出完整代码时,可以描述解题思路。 

注意到每组anagram的字母在忽略组合顺序与大小写时完全相同 
可以考虑对单词做如下转换,将一组anagram映射到唯一一个字符串上 
转换方法,最简单的是将单词的各个字母变成小写,在按照字母顺序排序 
如下: 
XkLs→klsx 

SUN给了一个思路:List+Map来实现MultiHashMap. 

点击(此处)折叠或打开

  1. package littlejava;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Map.Entry;
  11. import java.util.Set;

  12. public class MultiHashMap4Word
  13. {
  14.     /**
  15.      * 从输入的字符串数组中得到Anagram
  16.      * 假定:字符串全部都是由a-z、A-Z组成的
  17.      *
  18.      * @param strArray
  19.      * @return HashMap
  20.      */
  21.     public static HashMap> searchAllAnagram(String[] strArray)
  22.     {
  23.        
  24.         HashMap>wordMap=new HashMap>();
  25.         
  26.   

  27.         for (int i = 0 ; i < strArray.length ; i++)
  28.         {
  29.             String word = strArray[i];
  30.             String key = convertWord(word);
  31.             if(wordMap.containsKey(key))//如果key已经加进去
  32.             {
  33.                 wordMap.get(key).add(word);
  34.             }
  35.             else
  36.             {
  37.                 ArrayList temp=new ArrayList();
  38.                 temp.add(word);
  39.                 wordMap.put(key, temp);
  40.             }
  41.               
  42.         }
  43.         return wordMap;
  44.   
  45.         
  46.     }
  47.   
  48.     public static String convertWord(String word)
  49.     {
  50.         if (word == null){
  51.             return "";
  52.         }
  53.   
  54.         char[] charArray = word.toLowerCase().toCharArray();
  55.         Arrays.sort(charArray);
  56.         return String.valueOf(charArray);
  57.     }
  58.   
  59.     public static void main(String[] args)
  60.     {
  61.         String[] strArray = new String[]{
  62.             "abc", "BcA", "Cba", "abcd", "BBcA", "aXbB", "zzxYyy", "yyZzxy",
  63.             "rsuT", "turS", "fix", "xiF", "dcna", "abcd"
  64.         };
  65.   
  66.         HashMap>wordMap = searchAllAnagram(strArray);
  67.         
  68.         Iterator it = wordMap.entrySet().iterator();
  69.         int i=0;
  70.         while(it.hasNext())
  71.         {
  72.             Map.Entry entry = (Entry) it.next();
  73.             ArrayListalist = (ArrayList) entry.getValue();
  74.             System.out.println("=========Anagram " + i + " : =========");
  75.             for(int j=0;j
  76.             {
  77.                 System.out.println(alist.get(j));
  78.             }
  79.             i++;
  80.         }
  81.         
  82.     }
  83. }
输出:
=========Anagram 0 : =========
zzxYyy
yyZzxy
=========Anagram 1 : =========
rsuT
turS
=========Anagram 2 : =========
abc
BcA
Cba
=========Anagram 3 : =========
fix
xiF
=========Anagram 4 : =========
BBcA
=========Anagram 5 : =========
dcna
=========Anagram 6 : =========
abcd
abcd
=========Anagram 7 : =========
aXbB

阅读(1069) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~