leetCode 49.Anagrams (回文构词法) 解题思路和方法
来源:互联网 发布:网络玄幻小说合集chm 编辑:程序博客网 时间:2024/05/21 10:26
Anagrams
Given an array of strings, return all groups of strings that are anagrams.
本题在开始写的代码很繁琐,如下,作为参考,没有用set判断,所以很繁琐,效率也不高。
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
- leetCode 49.Anagrams (回文构词法) 解题思路和方法
- [LeetCode]—Anagrams 回文构词法
- [LeetCode(Q49)] Anagrams (回文构词法)
- LeetCode OJ 之 Anagrams (回文构词法)
- leetCode 9.Palindrome Number (回文数字) 解题思路和方法
- 回文构词法
- leetCode 18.4Sum (4数字和) 解题思路和方法
- [leetcode] 49. Group Anagrams 解题报告
- [Leetcode] 49. Group Anagrams 解题报告
- [LeetCode]Anagrams,解题报告
- 【LeetCode】Anagrams 解题报告
- [LeetCode] Anagrams 解题报告
- leetCode 1. Two Sum 解题思路和方法
- leetCode 22.Generate Parentheses (生成括号) 解题思路和方法
- leetCode 27.Remove Element (删除元素) 解题思路和方法
- leetCode 39.Combination Sum(组合总和) 解题思路和方法
- leetCode 44.Wildcard Matching (通配符匹配) 解题思路和方法
- leetCode 46.Permutations(排列组合) 解题思路和方法
- cpu和内存之间——地址映射
- EXCEL 合并两列的内容
- CSS的盒模型属性总结
- Nagios 监控系统架设全攻略
- GRE写作必备句型
- leetCode 49.Anagrams (回文构词法) 解题思路和方法
- 黑马程序员——path和classpath的作用
- hdu 4496 D-City(并查集)
- iOS-MD5加密
- x的平方根
- tableview cell in section
- 053第425题
- Linux系统日常管理
- GRE写作必备句型