算法day07

 第一题

30. 串联所有单词的子串

        上题题意如下:

         将w数组里面的字符串随机排列,只要在s字符串中找到相对应的w组成的字符串,则返回s中对应字符串首位元素的第一个下标;

        

        有上述题意所知,解题思路如上一题故事,本题采用hash表和滑动窗口的模型;

        首先对于words字符串数组进行处理:

        

        由于这里面的字符串的长度一样,所以我们将每一个字符串一组放在hash1表中,并记录其存放的个数;

        其次就是对s字符串的处理分析:

        如下图所示:

        由于我们存放在hash1中的字符串的长度是len,所以我们在开始左右指针进行移动时,从s的第一个位置和第二个位置开始移动时,结果是不一样的;所以我们分别要从其实位置为0->len-1,分别开始移动左右指针;

        且接下来分析右指针所移动的随后判断结束点,如下图所示,

        最理想的结果莫过于移动到上图n处,但是也可能移动到m和a处,所以最后的right指针应该移动范围是right+len < n;

        关于分析综上所述:

       解题步骤如下:

步骤一:

        使用hash表来存放words和s里面的字符串;

步骤二:

        左右指针移动,移动的长度是words里面字符串的长度;

步骤三:

        滑动窗口执行的次数,即外循环,len次;

代码如下所示:

class Solution
{
 public List<Integer> findSubstring(String s, String[] words) 
 {
 List<Integer> ret = new ArrayList<Integer>();
 // 保存字典中所有单词的频次
 Map<String, Integer> hash1 = new HashMap<String, Integer>(); 
 for(String str : words) hash1.put(str, hash1.getOrDefault(str, 0) + 1);
 int len = words[0].length(), m = words.length;
 for(int i = 0; i < len; i++) // 执⾏次数
 {
 // 保存窗⼝内所有单词的频次
 Map<String, Integer> hash2 = new HashMap<String, Integer>(); 
 for(int left = i, right = i, count = 0; right + len <= s.length(); 
right += len)
 {
 // 进窗⼝ + 维护 count
 String in = s.substring(right, right + len);
 hash2.put(in, hash2.getOrDefault(in, 0) + 1);
 if(hash2.get(in) <= hash1.getOrDefault(in, 0)) count++; 
 // 判断
 if(right - left + 1 > len * m)
 {
 // 出窗⼝ + 维护 count
 String out = s.substring(left, left + len);
 if(hash2.get(out) <= hash1.getOrDefault(out, 0)) count--;
 hash2.put(out, hash2.get(out) - 1);
 left += len;
 }
 // 更新结果
 if(count == m) ret.add(left);
 }
 }
 return ret;



    }
}

第二题

        题目如上图所示:

        本题我们采用滑动窗口和hash表的解题方法:

步骤一:

        将t字符串里面的字符放在hash2表中,使用hash2记录每一个元素出现的次数,并使用kinds变量来记录t字符串中字符的种类;

        同时定义左右指针;

步骤二:

        进窗口:

        右指针移动一位,将所指的字符存于hash1表中,并记录当前所指元素出现在hash表中的次数;同时使用count来记录hash1表中的有效种类;(使用两个hash中同一个元素存放的次数相同时,我们就判定该元素满足t字符串中的种类饱和,故此count++)

步骤三:判断:

        当有效种类count==kinds时,记录当前左指针的位置为满足条件字符串的首位置,同时记录当前窗口的长度,最后进行出窗口操作;

        左指针所指的元素的两个hash值相同时,count--,同时该元素的hash值-1,左指针左移;

步骤四:

        返回数值;

        代码如下所示:

           
class Solution {
    public String minWindow(String s, String t) {
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        int[] hash2 = new int[128];
        int kinds = 0;//表示t中元素的种类
        for(char ch: t1){
            if(hash2[ch] == 0){
                kinds++;
            }
            hash2[ch] ++;
        }
        int[] hash1 = new int[128];
        int minLen = Integer.MAX_VALUE,begin = -1;
        for(int left = 0,right = 0,count = 0;right < s1.length;right++){
            char in = s1[right];
            hash1[in]++;
            if(hash2[in] == hash1[in]){
                count++ ;
            }
            while(kinds == count){
                if(right-left+1 < minLen){
                    begin = left;
                    minLen = right-left+1;
                }
                char out = s1[left++];
                if(hash2[out] == hash1[out]){
                    count--;
                }
                hash1[out]--;
            }
            
        }if(begin == -1){
            return new String();
        }else{
            return s.substring(begin,begin+minLen);
        }
    }
}

ps:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React搭建-Next 学习-1

创建一个 Next.js 应用,node版本要高&#xff0c;16.5以上 npm淘宝镜像切为https://registry.npmmirror.com npm config set registry https://registry.npmmirror.com npx create-next-applatest//安装后 使用npm run dev 启动 Next.js 是围绕着 页面&#xff08;pages&am…

如何启用WooCommerce商城快捷结帐:3 种简单方法

使用WooCommerce商城快捷结帐可帮助您提高商店的转化率。 70%的顾客同意在线商店的快速结账流程会鼓励他们完成购买。 在结账过程中您让购物者完成的步骤越多&#xff0c;他们完成该流程的可能性就越小。 解决方案是什么&#xff1f; 通过跳过默认的WooCommerce商城购物车页…

怎么看电脑是固态还是机械硬盘?数据丢失怎么办

在数字化时代&#xff0c;电脑硬盘作为数据存储的核心部件&#xff0c;其类型直接关系到数据读写速度和存储效率。固态硬盘&#xff08;SSD&#xff09;与机械硬盘&#xff08;HDD&#xff09;作为目前市场上主流的两种硬盘类型&#xff0c;各有其优缺点。然而&#xff0c;对于…

【LeetCode刷题】27. 移除元素

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 27. 移除元素 2. 题目描述 3. 解题方法 暴力法直接解决&#xff0c;用双层for循环&#xff0c;外层for循环找val&#xff0c;内层for循环做删除操作。双指针法&#xff0c;fast和slow。fast找不是val的值&#xff0c;…

网站如何启用HTTPS访问

在互联网的世界里&#xff0c;数据安全已经成为了每个网站和用户都不得不面对的问题。近期&#xff0c;网络信息泄露事件频发&#xff0c;让越来越多的网站开始重视起用户数据的安全性&#xff0c;因此启用HTTPS访问成为了一个热门话题。作为一名网络安全专家&#xff0c;我希望…

【C语言习题】6.逆序输出

文章目录 1.描述输入描述&#xff1a;输出描述&#xff1a;示例图&#xff1a; 2.解题思路3.具体代码4.代码讲解 1.描述 输入10个整数&#xff0c;要求按输入时的逆序把这10个数打印出来。逆序输出&#xff0c;就是按照输入相反的顺序打印这10个数。 输入描述&#xff1a; 一…

实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

《五》Word文件编辑软件调试及测试

上一期&#xff0c;我们已经把大致的框架给完成了&#xff0c;那么今天&#xff0c;我们就把剩下的什么复制啊&#xff0c;改变字体啊什么的给做一下。 那我们就一步一步的来就可以了&#xff1a; 新建word&#xff1a; void MyWord::fileNew() {qDebug()<<"hhh&…

在不同的应用系统创建Python虚拟环境

在不同的应用系统创建Python虚拟环境 在Linux上创建Python虚拟环境 一、在Ubuntu上创建Python虚拟环境 可以通过使用virtualenv工具来完成。下面是创建Python虚拟环境的步骤&#xff1a; 首先确保已经安装了python3-venv包&#xff08;如果没有安装&#xff0c;则需要运行命…

产品经理如何进行项目管理?

产品经理如何进行项目管理&#xff1f; 项目管理和产品管理在本质上还是有一定差别的。产品更关注的是产品、功能、方向和反馈&#xff0c;而项目则更关注进度、质量和测试等。如果团队没有项目经理&#xff0c;那么产品经理就需要兼顾对开发人员、项目进度等进行管理。 此时…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

软考-下午题-试题一

1、概念 2、答题技巧和规范 问题1、2&#xff1a;直接看 格式&#xff1a; 问题3&#xff1a; 格式&#xff1a; 3、例题 eg2&#xff1a;可以以后写完问题4之后&#xff0c;把问题3补充完整 问题4&#xff1a; 问题4 官方解释&#xff1a; 问题4&#xff08;3‘&#xff09; 2…

AI智能对话绘画二合一系统源码 在线生成绘画 带完整的源代码包以及搭建教程

系统概述 AI智能对话绘画二合一系统源码是一款集成了自然语言处理、深度学习、计算机视觉等多种技术的智能系统。该系统通过强大的自然语言处理能力&#xff0c;能够与用户进行流畅的AI对话&#xff0c;无论是创作构思、风格选择还是技巧咨询&#xff0c;系统都能给出精准的建…

7集成学习评分卡

集成学习评分卡 学习目标 知道LightGBM基本原理掌握使用lightGBM进行特征筛选的方法1 Gradient Boosting算法回顾 Gradient Boosting 基本原理 训练一个模型m1,产生错误e1针对e1训练一个模型m2,产生错误e2针对e2训练第三个模型m3,产生错误e3 …最终预测结果是:m1+m2+m3+…GB…

如何去除AI写作痕迹?笔灵去AI痕迹,提升论文质量

AI助手大集合&#xff0c;猛戳进来&#xff01; 在工作和生活中&#xff0c;我经常使用各种各样的人工智能工具&#xff0c;如AI写作软件、AI语音助手、AI绘图工具等。我发现&#xff0c;这些工具能够极大地提高工作效率并简化日常生活。作为一名AI工具的忠实爱好者&#xff0…

TortoiseGit的安装

TortoiseSvn和TortoiseGit都是针对代码进行版本管理的工具&#xff0c;又俗称小乌龟&#xff0c;简洁而可视化的操作界面&#xff0c;免去繁琐的命令行输入。只需要记住常用的几个操作步骤就能快速上手。 TortoiseGit安装 1、TortoiseGit作为git的版本管理工具 &#xff0c;但…

粘贴图片上传,显示剪切板中的图片

<van-cell-group inset><van-fieldpaste.native"(e) > handlePasting(e, index)"autosizeplaceholder"请将图片粘贴到此处"/> </van-cell-group> <div class"img-list"><divclass"img-item"v-for"…

在 Cython 中高效访问 scipy lil_matrix

在 Cython 中高效地访问 scipy 的 lil_matrix&#xff08;LInked List format&#xff09;可以通过以下步骤实现&#xff1a; 导入所需的模块&#xff1a; 首先&#xff0c;导入必要的模块&#xff0c;包括 numpy 和 scipy.sparse 中的 lil_matrix。定义函数原型&#xff1a; …

设备全生命周期管理平台:奏响设备管理的“高效乐章”

设备的全生命周期管理是一个复杂而关键的任务。设备的购买、安装、维护和报废都需要精细的管理和跟踪。然而&#xff0c;传统的设备管理方法往往效率低下、信息不准确&#xff0c;并且容易出现遗漏和错误。为解决这一问题&#xff0c;设备全生命周期管理平台应运而生。 设备全…

【Linux系统编程】基本指令(二)

目录 1、mv指令 2、cat指令 输出重定向 ​编辑 追加重定向 输入重定向 3、more指令 4、less指令 5、head指令 6、tail指令 与时间相关的指令 7、date指令 8、cal指令 9、find指令 10、grep指令 11、zip/unzip指令 1、mv指令 mv文件是用来对文件或目录进行重命名…