首页 > 其他分享 >简单滑动窗口题目解析(c实现)

简单滑动窗口题目解析(c实现)

时间:2023-06-10 16:01:01浏览次数:55  
标签:right 题目 int 元素 哈希 滑动 解析 窗口 left

下面的题目要使用的主要思路为滑动窗口,但是还需要使用哈希表来储存窗口中的元素个数

题目一:无重复字符的最长子串

题目一链接

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。


示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

那么要如何去寻找s中不含有重复字符的最长子串呢?

我首先会定义两个整型名字为left(代表的是左窗口指向元素的下标),right(代表的是右窗口指向元素的下标)。以及一个哈希表,(因为题目中只会出现char类型的数据,所以我们可以使用一个大小为128的整型数组来模拟实现哈希表,因为char类型的asc2码范围为-127到128,那么使用一个大小为128的整型数组肯定能够装下)这个哈希表的用途是记录窗口中的元素个数。那么一开始窗口中没有元素,left和right下标肯定是从0开始,接下来right会将下标为0的元素放入窗口中去,同时在哈希表中下标为这个元素的大小也就会加1。然后如果这个元素的个数不大于1就继续让右指针移动往窗口中放元素,直到放入的一个元素大小大于1了,我们在让左指针加加,同时让左指针代表的原数在哈希表中的数量减去1,直到这个窗口中没有数量大于1的元素。

下面是代码实现:

int lengthOfLongestSubstring(char * s)
{
	//使用思路为滑动窗口
	//其中在窗口内的元素我们使用一个哈希表来维护
	int ret = 0;//先假定最长的字串为0
	int left = 0;//左窗口坐标
	int right = 0;//右窗口坐标
	int haxi[128];//因为只会出现字符,那么只需要使用127大小的哈希表即可解决
	//并且因为题目中出现的字符不存在重复的情况也不会导致出现哈希表下标表示冲突的情况
	memset(haxi,0,sizeof(haxi));//将哈希表内的所有值修改为0
  int len = strlen(s);
	while(right<len)
	{
		char ch = s[right];//将这个要放入窗口中的元素先储存起来
        right++;//让right指向下一个即将将进入窗口的元素
		//用来作为访问哈希表的下标
		haxi[ch]++;//放入窗口中去了自然要更新哈希表的数据
		while(haxi[ch]>1)//如果窗口里面之前就存在了这个元素那么就要将left位置的元素移除出窗口
		//直到我们删除了这个新进入元素在窗口里面重复的那一部分
        {
            char del = s[left];
            haxi[del]--;
            left++;
        }
        ret = ret>(right - left)?ret:(right - left);
	}
    return ret;
}

简单滑动窗口题目解析(c实现)_bc

题目二:找到字符串中所有字母异位词 

题目二做题链接

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

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

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

这道题目先创建一个大小为128的哈希表1,用于储存字符串p中各个字符出现的次数。

然后我们在s上使用一个固定大小的滑动窗口,滑动窗口的大小也就是p的长度。然后我们比较窗口内的元素个数和p中的元素个数是否相等,相等则为异位词并且将左窗口的值放入到结果数组里面,不等则将窗口向右推进。

下面是代码实现:

int* findAnagrams(char* s, char* p, int* returnSize)
{
    int lenp = strlen(p);
    int lens = strlen(s);
    if (lens < lenp)//不可能存在字母异位词
    {
        *returnSize = 0;
        return NULL;
    }
    int haxis[128] = { 0 };
    int haxip[128] = { 0 };
    int* ret = (int*)malloc(sizeof(int) * (lens - lenp + 1));
    int count = 0;//用于记录满足条件的索引有多少个
    if (ret == NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    for (int i = 0; i < lenp; i++)
    {
        haxip[p[i]]++;//p字符里面的所有元素都放入到记录p元素个数的哈希表中去
    }
    int left = 0;
    int right = 0;//这是s哈希表的左下标和右下标
    for (; right < lens; right++)
    {
        haxis[s[right]]++;
        if (haxis[s[right]] > haxip[s[right]])//这里就表示放入到haxis中的这个元素的个数大于了
            //在p中的这个元素的个数
        {
            while (haxis[s[right]] > haxip[s[right]])
            {
                haxis[s[left]]--;//我们要利用左窗口指针让左窗口的元素移除出窗口
                left++;//直到窗口中新增加的元素等于p中这个元素的个数
            }
        }
        if (right - left + 1 == lenp && memcmp(haxip, haxis, sizeof(int) * 128) == 0)//如果现在在窗口中的元素等于p的长度
            //并且两个哈希数组相等则可以将索引放入结果数组中去
        {
            ret[count++] = left;
        }
    }
    *returnSize = count;
    return ret;
}

简单滑动窗口题目解析(c实现)_子串_02

标签:right,题目,int,元素,哈希,滑动,解析,窗口,left
From: https://blog.51cto.com/u_15838996/6454754

相关文章

  • Python小屋刷题软件2425道题目分类速查表
    “Python小屋”编程比赛正式开始Python小屋刷题软件客户端使用说明(视频讲解)Python小屋刷题神器最近升级的新功能介绍每次录入新题目时都会更新下面的分类表,请注意查看最新信息。客观题分类:Python基础知识:1-57内置函数、运算符:58-320列表、元组、字典、集合、切片、推导式:321-792选......
  • Python小屋刷题神器题目分类速查表
    每次录入新题目时都会更新下面的分类表,请注意查看最新信息。客观题:Python基础知识:1-36内置函数、运算符:37-271列表、元组、字典、集合、切片、推导式:272-679选择结构与循环结构:680-765字符串操作:766-988正则表达式:989-1080函数定义与使用:1081-1220面向对象程序设计:1221-1293文件操......
  • 解析隧道代理IP与API代理IP的区别
    隧道代理IP和API代理IP是两种常见的代理IP类型,它们在实现方式和使用场景上有一些区别。第一部分:隧道代理IP的特点和用途隧道代理IP:隧道代理IP(TunnelProxyIP)是通过在客户端和目标服务器之间建立一个隧道连接来实现代理的。具体来说,隧道代理IP会在客户端和目标服务器之间扮演中间人......
  • 解析url
    //parseurl解析urlcc++代码rfc2068#include<stdio.h>#include<string.h>#include<stdlib.h>//解析url,作为示例,很多情况没考虑,比如说user,pass之类的intparse_url(char*url,char**serverstrp,int*portp,char**pathstrp){charbuf[256];......
  • 全网八股文面试高频题目--JAVA基础
    八股文--JAVA基础目录八股文--JAVA基础1.JDK、JRE、JVM有什么区别1.1Java为什么被称为平台无关性语言?2.常用数字类型的区别3.Float在JVM的表达方式及使用陷阱4.面向对象三个特性是什么4.1重载和重写的区别?4.2Java中是否可以重写一个private或者static方法?4.3构造方法有哪些......
  • WPF中实现含有中心点Slider双向滑动条
    想要实现的效果原生滑动条需要认识一下滑动条的组成在原生控件中生成“资源字典”对应的样式然后在track所在的列进行添砖加瓦由于track在row="1"的位置,只需要在这个位置上面添加一个Ellipse和LineEllipse是来描述固定在滑动条上的中心点的位置line是来描述Thumb从中心......
  • QT桌面(实现界面的滑动切换)
    (文章目录)前言在ARMLinux中使用QT如何实现滑动翻页切换界面的效果呢?在ARM中是没有自带的鼠标的,那么我们如何实现滑动翻页呢?经过测试发现在ARM中运行QT程序也是可以通过重写鼠标事件来捕获触屏动作的,在ARM中滑动屏幕被定义成了鼠标左键事件,那么这样就有思路了,重写鼠标事件。一......
  • k8s 证书全解析
    #01-创建证书和环境准备本步骤主要完成:-(optional)role:os-harden,可选系统加固,符合linux安全基线,详见[upstream](https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/os_hardening)-(optional)role:chrony,[可选集群节点时间同步](../guide/chrony......
  • Kubernetes添加解析操作文档
    ​Kubernetes添加解析操作文档​1.首先在kube-system命名空间创建configmap,添加自定义host解析kubectlcreateconfigmap-nkube-systemkubedns-host##createconfigmap指明创建的类型#-n指定命名空间#kubedns-host自定义的configmap命名。(建议统一使用kubedns-hos......
  • 深入解析React DnD拖拽原理,轻松掌握拖放技巧!
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:霁明一、背景1、业务背景业务中会有一些需要实现拖拽的场景,尤其是偏视觉方向以及移动端较多。拖拽在一定程度上能让交互更加便捷,能......