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

来源:互联网 发布:网络玄幻小说合集chm 编辑:程序博客网 时间:2024/05/21 10:26
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;    }}


0 0
原创粉丝点击