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

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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值