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; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-28 12:49:36