1.leetcode:49. Group Anagrams

1.1问题描述

Given an array of strings, group anagrams together.

Example:

Input: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Output:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]

1.2思路

这道题主要意思是要把相同代码分布的词归为一组,如果我们知道桶排序的话,这就有点类似了,只不过我们要找到一个衡量角度,那就是字符串。经过排序后的字符串是一样的。

1.3代码

public List<List<String>> groupAnagrams(String[] strs) {List<List<String>> result = new ArrayList<>();//对每一标识进行存储。HashMap<String, ArrayList<String>> hashMap=new HashMap<>();for (String string : strs) {char[] tag_string=string.toCharArray();Arrays.sort(tag_string);String tag=new String(tag_string);//如果没包含这个标识if(!hashMap.containsKey(tag)){hashMap.put(tag, new ArrayList<>());}hashMap.get(tag).add(string);}//输入结果。for (ArrayList<String> strings : hashMap.values()) {result.add(strings);}return result;}

2.leetcode:438.Find All Anagrams in a String

2.1问题描述

Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.
Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.
The order of output does not matter.

Example 1:

Input:
s: “cbaebabacd” p: “abc”
Output:
[0, 6]
Explanation:
The substring with start index = 0 is “cba”, which is an anagram of “abc”.
The substring with start index = 6 is “bac”, which is an anagram of “abc”.

2.2思路

其实我们完全可以参考第一个的思路来解决这个问题,也就是对每一个查询长度进行一个Sort然后进行比较。但是注意的是,这样做是肯定不行的,因为时间复杂度太高,尽管我给出代码。

2.3代码

 HashMap<String, List<Integer>> hashMap=new HashMap<>();char[] chars=s.toCharArray();char[] charp=p.toCharArray();Arrays.sort(charp);String pString=new String(charp);hashMap.put(pString, new ArrayList<>());for(int start=0,end=p.length()-1;end<s.length();start++,end++) {char[] tempchars=Arrays.copyOfRange(chars, start, end+1);Arrays.sort(tempchars);String temps=new String(tempchars);if(hashMap.containsKey(temps)) {hashMap.get(temps).add(start);}}return hashMap.get(pString);

2.4更进一步

这里我们可以看到,主要是在于,我们重复的对窗口内的字符进行排序了,那么我们如何保持目标的字母分布呢?在我们窗口的右侧,每前进一格,我们就要收录一格字符的分布,在窗口的左侧,我们每前进一格,就要放弃一格字符的分布,但是我们保持目标值与当前值得差值,这样可以省去每次的比较。

2.5代码

List<Integer> list = new ArrayList<>();if (s == null || s.length() == 0 || p == null || p.length() == 0) return list;//表达出类似hash表的作用int[] hash = new int[256]; //统计p内的字符for (char c : p.toCharArray()) {hash[c]++;}//开始和结束节点,count是P中字符的个数int left = 0, right = 0, count = p.length();while (right < s.length()) {//如果它大于等于1,说明这个字符是目标字符if (hash[s.charAt(right)] >= 1) {count--;}hash[s.charAt(right)]--;//右边移动right++;//如果确实都完全命中完毕if (count == 0) {//记录目前的值list.add(left);}//如果目前遍历到达p的长度了if (right - left == p.length() ) {//如果left在hash表中,说明这个字符是要找的,否则的话,它是负数if (hash[s.charAt(left)] >= 0) {count++;}     hash[s.charAt(left)]++;//左边的移动left++;}}return list;

2.6小结

这是另外一种思想了,除去桶排序,另一种思想是直方分布图,它可以解决的问题就是维持一个分布,省去了排序等操作。

3.总结

我们这次主要熟悉两种解法,一个是桶排序,依靠的是HashMap来实现。另一个是直方分布图的形式。

leetcode(19):Anagrams (字谜游戏)相关推荐

  1. leetcode 1178.猜字谜

    leetcode 1178.猜字谜 题干 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧. 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么 ...

  2. 记录一下leetcode:1178猜字谜

    import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;/*** leetcode ...

  3. 选择问题 and 字谜游戏问题

    #include <stdio.h> #include <stdlib.h> // 第一题 // 找出N个数的第k个最大者 // 方法1:排序(冒泡),降序找出第k个值 // ...

  4. [链表|多解法] leetcode 19 删除链表的倒数第N个节点

    [链表|多解法] leetcode 19 删除链表的倒数第N个节点 1.题目 题目链接 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2-&g ...

  5. LeetCode 19. Remove Nth Node From End of List

    LeetCode 19. Remove Nth Node From End of List Solution1:我的答案 并不算是最优解法. /*** Definition for singly-li ...

  6. 数据结构与算法 | Leetcode 19. Remove Nth Node From End of List

    原文链接:https://wangwei.one/posts/jav... 前面,我们实现了 两个有序链表的合并 操作,本篇来聊聊,如何删除一个链表的倒数第N个节点. 删除单链表倒数第N个节点 Lee ...

  7. Leetcode 45:跳跃游戏 II(最详细的解法!!!)

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...

  8. (LeetCode C++)跳跃游戏

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个下标. 示例 1: 输入:nums = [2,3,1, ...

  9. 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)

    约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...

  10. LeetCode 1823. 找出游戏的获胜者

    LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...

最新文章

  1. linux文件中链接文件系统,一种基于Linux文件系统文件链接的缓存LRU方法
  2. 第6章-一阶多智体系统一致性-->6.4 切换拓扑系统一致性
  3. android settext 参数,Android TextView.setTextColor()的参数设置方式
  4. 《深入理解Java虚拟机》第5章 调优案例分析与实战
  5. ABBYY PDF Transformer+功能概述
  6. windows 环境变量设置
  7. redis分布式锁的复杂实现
  8. 活动回顾 I 《传奇动物园》项目团队沙盘演练圆满结束!
  9. 5G版聚合路由器加速释放超高清视频传输应用
  10. 关于网站速度优化的一点建议
  11. 【STM32H7的DSP教程】第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点
  12. PUN☀️八、拓展网络同步:RPCs 和 Properties
  13. 执行shellcode一直提示illegal instruction
  14. centos系统添加桌面图标
  15. 嵌入式linux学习笔记--gitlab学习笔记-gitlab-runnner简单的使用介绍
  16. 香蕉派BPI-M6 采用深蕾半导体Vs680芯片设计,板载4G LPDDR4和16G eMMC存储
  17. VScode 插件中 package.json 文件 activationEvents 字段详解
  18. 【转】91个排名:中国知名个人站长及发家史
  19. extmail mysql数据库 重启_Extmail邮件服务器centos搭建(一)(示例代码)
  20. 计算机四级百度云资源,干货来了!学习部网盘整理链接

热门文章

  1. c# python3_从C#到Python —— 3 函数及函数编程
  2. SiamRPN++相对于SiamRPN的改进
  3. 武汉大学计算机学院2018夏令营,武汉大学
  4. 共线性分析软件MCScanX安装、报错解决方法及使用
  5. 算法学习:最小公倍数求法()
  6. Linux部署启动服务脚本
  7. 数据标签词构造维度表
  8. C\C++ | FILE文件基本操作函数
  9. Java生成二维码,Spring Boot整合ZXing实现二维码生成,支持自定义二维码
  10. 999. Available Captures for Rook