【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词

这篇具有很好参考价值的文章主要介绍了【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词,算法挨揍日记,Leetcode,算法,哈希算法

 904. 水果成篮

904. 水果成篮

题目描述:

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词,算法挨揍日记,Leetcode,算法,哈希算法

解题思路: 

本题可以转化为最长的连续子数组(最多只能有两种种类的水果),可以用滑动窗口来解决

我们从左往右right一直走,当找到了一段符合条件的子序列,我们需要继续向右验证最长的这个特性,该如何操作呢?我们来看一下,以下【left,right】是寻找过程中符合题目条件的一个子序列

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词,算法挨揍日记,Leetcode,算法,哈希算法 此时right需要向右++,这个时候可能会出现两种情况:

  • right++后,kind(水果的种类)不变
  • right++后,kind减小,

这里值得注意的是当水果的种类减少后需要进行一下处理

 解题代码:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        unordered_map<int,int> hash;
        int ret=0;
        for(int left=0,right=0;right<fruits.size();right++)
        {
            hash[fruits[right]]++;
            while(hash.size()>2)
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]]==0)
                hash.erase(fruits[left]);
                left++;
            }
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};

438. 找到字符串中所有字母异位词

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述: 

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

 解题思路:

我们先通过暴力解法来分析一下题目:

我们可以遍历s中每个位置,让他们跟p进行判断是否为异位词

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词,算法挨揍日记,Leetcode,算法,哈希算法

我们发现这是一个滑动区间【left,right】的解法,我们来想办法实现其优化

首先我们可以利用哈希表hash1来存储p中每个字符和其个数 ,并且可以在滑动期间中利用hash2来记录s中的字符和个数

我们这里还需要一个变量length=p.size(),以及一个变量count来记录有效字符的个数

1.进窗口——hash2[s[right]]++

if(hash2[s[right]]<=hash1[s[right]]) count++;

2.当right-left+1>length进行判断

3.出窗口——hash2[s[left]]--

if(hash2[s[left]]<=hash1[s[left]]) count--;//在出窗口前更新count

4.更新结果——count==length

!这里的哈希表可以用大小为26的数组代替,并且速度更快

解题代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int>ret;
        int length=p.size();
        unordered_map<char,int>hash1;
        for(int i=0;i<p.size();i++) hash1[p[i]]++;
        unordered_map<char,int>hash2;
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char ch=s[right];
            //进窗口
            hash2[ch]++;
            if(hash2[ch]<=hash1[ch]) count++;
            //判断
            if(right-left+1>length)
            {
                char out=s[left];
                if(hash2[out]<=hash1[out]) count--;//在出窗口前更新count
                hash2[out]--;//出窗口
                left++;
            }
            //更新结果
            if(count==length)
                ret.push_back(left);
        }
        return  ret;
    }
};

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词,算法挨揍日记,Leetcode,算法,哈希算法文章来源地址https://www.toymoban.com/news/detail-722517.html

到了这里,关于【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法挨揍日记】day16——525. 连续数组、1314. 矩阵区域和

    525. 连续数组 给定一个二进制数组  nums  , 找到含有相同数量的  0  和  1  的最长连续子数组,并返回该子数组的长度。 本题的元素只有0和1,根据题目意思,我们可以把题目看成找一段最长的子区间使得区间的0 和1的数量相同,我们可以对其优化将所有的0变成-1,这样这

    2024年02月03日
    浏览(35)
  • 【算法挨揍日记】day04——15. 三数之和、18. 四数之和

      15. 三数之和 https://leetcode.cn/problems/3sum/ 给你一个整数数组  nums  ,判断是否存在三元组  [nums[i], nums[j], nums[k]]  满足  i != j 、 i != k  且  j != k  ,同时还满足  nums[i] + nums[j] + nums[k] == 0  。请你返回所有和为  0  且不重复的三元组。 注意: 答案中不可以包含重复的三元

    2024年02月09日
    浏览(42)
  • 【算法挨揍日记】day02——双指针算法_快乐数、盛最多水的容器

    202. 快乐数 https://leetcode.cn/problems/happy-number/ 编写一个算法来判断一个数  n  是不是快乐数。 「快乐数」  定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是  无限循环  但始终变不到 1。 如果这

    2024年02月11日
    浏览(27)
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

       611. 有效三角形的个数 https://leetcode.cn/problems/valid-triangle-number/ 给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边    题

    2024年02月12日
    浏览(38)
  • 力扣精选算法100题——水果成篮(滑动窗口专题)

    本题链接👉水果成篮 我就按照实例1来进行对这题的理解。 1代表种类类型,这个数组里面有2个种类类型 ps:种类1和种类2 ,只不过种类1是有2个水果,种类2有一个水果,共计3个水果。 本题需要解答:收集水果的最大数目. 但是前提条件: 我们只有2个篮子,每个篮子里只能装

    2024年01月17日
    浏览(31)
  • 每日OJ题_算法_滑动窗口⑥_力扣438. 找到字符串中所有字母异位词

    目录 力扣438. 找到字符串中所有字母异位词 解析及代码1 解析及代码2 438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 难度 中等 给定两个字符串  s  和  p ,找到  s   中所有  p   的  异位词  的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词  指由

    2024年01月24日
    浏览(36)
  • 滑动窗口实例5(水果成篮)

    你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组  fruits  表示,其中  fruits[i]  是第  i  棵树上的水果  种类  。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有  两个  篮子,并且每

    2024年02月10日
    浏览(35)
  • 438. 找到字符串中所有字母异位词【异位词-哈希数组】

    438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = “cbaebabacd”, p = “abc” 输出: [0,6] 解释: 起

    2023年04月27日
    浏览(30)
  • 力扣热题100_滑动窗口_438_找到字符串中所有字母异位词

    438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = “cbaebabacd”, p = “abc” 输出: [0,6] 解释: 起

    2024年02月19日
    浏览(33)
  • 算法基础复盘笔记Day07【搜索与图论】—— Prim、Kruskal、染色体判定二分图、匈牙利算法

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包