LeetCode题目:面试题 10.02. 变位词组

题目

题目链接:https://leetcode-cn.com/problems/group-anagrams-lcci/
题目解析:就是将字符串中字母数目相同的字符串放在一个集合里面。

  1. 创建map集合来存放判断依据,创建list集合来存放相同的变位字符串,通过将字符串按照字母大小重新排序,然后再进行比较,这样就可以很好地比较字符串是否是变位字符串。
  2. 遍历字符串数组,判断是否有相同的变位字符串
  3. 如果不是就重新创建一个list集合来存放字符串,然后将重新排列的字符串当作key,list在大list集合中的位置当作value放进map集合中
  4. 如果是就将大的list集合中拥有相同变位字符串的list集合拿出,放进去。

代码

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
    	//创键答案集合
    	List<List<String>> lists = new ArrayList<List<String>>();
    	//创建map集合
    	Map<String,Integer> map = new HashMap<String, Integer>();
    	//创建小的list集合
    	List<String> list2 = new ArrayList<>();
    	//遍历字符串
    	for (int i = 0; i < strs.length; i++) {
    		//将字符串按照字母大小重新排序
			String str = sort(strs[i]);
			//如果map集合中没有找到相同的字符串
			if(map.get(str)==null) {
				//创建新的list集合
				List<String> list = new ArrayList<>();
				//将判断字符串和list的位置放入map中
				map.put(str, lists.size());
				//list集合存放字符串
				list.add(strs[i]);
				//lists集合存放list
				lists.add(list);
			}else {//如果map集合有相同的字符串
				//从map中拿出对应字符串list集合的位置
				int l = map.get(str);
				//从lists集合中拿出list集合
				list2 = lists.get(l);
				//在list集合中添加字符串
				list2.add(strs[i]);
			}
		}
		return lists;

    }
    //将字符串按照字母大小进行排序
	private String sort(String string) {
		StringBuffer sb = new StringBuffer();
		int[] letter = new int[26];
		for(int i = 0;i<string.length();i++) {
			letter[string.charAt(i)-'a']++;
		}
		for(int i = 0;i<26;i++) {
			while(letter[i]>0) {
				sb.append((char)(i+'a'));
				letter[i]--;
			}
		}
		return sb.toString();
	}
}

你可能感兴趣的:(LeetCode)