码迷,mamicode.com
首页 > 其他好文 > 详细

leetCode 49.Anagrams (回文构词法) 解题思路和方法

时间:2015-07-13 14:04:39      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:leetcode

Anagrams 

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

Note: All inputs will be in lower-case.


思路:这题要是解,必须知道什么是回文构词法。所谓回文构词法就是把一个单词的顺序调整,形成新的单词,如”eat“,"tea"就是回文构词法。

所以回文构词法一定是相同的字母不同的顺序,而且最少有两个单词。

本题是将单词排序之后运用set查看是否重复,来判断是否回文构词。具体代码如下:

public class Solution {
    public List<String> anagrams(String[] strs) {
        List<String> list = new ArrayList<String>();
        if(strs.length <= 1){
            return list;
        }
        Map<String,Integer> map = new HashMap<>();
        Set<String> set = new HashSet<>();
        boolean[] b = new boolean[strs.length];//为每个字符串标记,初始均为false
        //处理字符串,变成有序的字符数组
        for(int i = 0; i < strs.length;i++){
        	char[] c = strs[i].toCharArray();
        	Arrays.sort(c);
        	StringBuffer sb = new StringBuffer();
        	for(char k:c){
        		sb.append(k);//将char数组转换成字符串
        	}
        	if(!set.add(sb.toString())){//里面已经存在相同的字符数组
        		list.add(strs[i]);
        		int index = map.get(sb.toString());
        		if(!b[index]){//还没有添加到list
        			list.add(strs[index]);
        			b[index] = true;//将标记置为true,
        		}
        	}else{
        		map.put(sb.toString(),i);//保存首次出现的字符串的索引i
        		set.add(sb.toString());//保存set,下次判断是否重复
        	}
        }
        return list;
    }
}

本题在开始写的代码很繁琐,如下,作为参考,没有用set判断,所以很繁琐,效率也不高。

public class Solution {
    public List<String> anagrams(String[] strs) {
        List<String> list = new ArrayList<String>();
        if(strs.length <= 1){
            return list;
        }
        Map<Integer,char[]> map = new HashMap<>();
        //处理字符串,变成有序的字符数组
        for(int i = 0; i < strs.length;i++){
        	char[] c = strs[i].toCharArray();
        	Arrays.sort(c);//排序
        	map.put(i, c);
        }
        boolean[] b = new boolean[strs.length];//为每个字符串标记,初始均为false
        for(int k = 0; k < strs.length -1 ; k++){
            if(!b[k]){//没有被标记
                 char[] c0 = map.get(k);//假定第k个字符串是回文构词
                 for(int i = k + 1; i < strs.length;i++){//从i=1开始
                     if(!b[i] && c0.length == strs[i].length()){//没有被判断是,且与c0字符数相等
                         char[] c1 = map.get(i);//数组化
                         int j = 0;
                         while( j < c0.length){
                             if(c0[j] != c1[j]){
                                 break;//如果不相同直接break
                             }else{
                                 j++;//相同+1
                             }
                         }
                         if(j == c0.length){//说明字全部相同
                             list.add(strs[i]);
                             b[k] = true;//开始那个也要标记
                             b[i] = true;//标记已是
                         }
                     }
                }
                 if(b[k]){//如果初始已标记,则在list加上
                	 list.add(strs[k]);
                 }
            }
        }
        return list;
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

leetCode 49.Anagrams (回文构词法) 解题思路和方法

标签:leetcode

原文地址:http://blog.csdn.net/xygy8860/article/details/46861321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!