leecode-3无重复字符串的最长子字符串C版-滑动窗口
要求:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1: 输入:
s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3示例 2: 输入:
s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
解法利用滑动窗口。
模式说明:输入一个数组或者字符串。求解的结果是觉有某种特征的子数组或者子字符串。这种情况下就可以利用滑动窗口求解。
滑动窗口思想如下
滑动窗口须注意的地方:
1.可以通过两个指针来确认边界
2.窗口可以是固定的,也可以是变化的。
程序:
程序思想:当符合要求时,窗口右边界移动,当不符合要求是,窗口左边界移动。
#include <stdio.h>
#include <string.h>int lengthOfLongestSubstring(char * s){int end=0; //子字符串(窗口)结束边界 int start=0; //子字符串(窗口)开始边界 int count = 0; /* 子串当前长度 */ int max=0; /* 子串最大长度 */char index[128] = {0}; /* 记录每个字符先后出现位置,index[128] = {0} index[]全部赋值为0 */if(s==NULL){return 0;} for(end=0;s[end]!='\0';end++){if(index[s[end]]> start) /* 若为真,则说明字符s[i]在之前重复出现过 */{ count = end - start; /* 记录此时子串的长度 */if(count>max) /* 若当前子串大于先前记录的最大字串长度,则更新max */{max = count; }start = index[s[end]]; /* 更新新子串的起始位置 */printf("start=%d\n",start);}
index[s[end]] = end + 1; /* 记录字符s[i]在整个字符串中出现的位置 ,s[end]可以转化为对应的assic码
比如 'a'=97, index[97]=end+1; 这样就标记课'a'出现的位置end+1 printf("%d,%c,end=%d\n",index[s[end]] ,s[end],end);
*/ } count = end - start; /* 计算最后一个子串的长度 */
return count > max ? count : max;
}
int main()
{ int len;char a[]={0};printf("请输入字符串:");scanf("%s",a);len = lengthOfLongestSubstring(a);printf("%d",len);}
代码中学到的东西:
- char index[128] = {0}; 将所有128个数都赋为0
- index[s[end]] = end + 1; 记录字符出现的位置。其中s[end]可以是字符也可以是数字。每个字符或者数字都要对应的asllic码。这样就可以确认字符或者数字出现的位置。
- 利用if(index[s[end]]> start) 来确认字符是否重复出现过,start开始为0,若字符没出现过则index[s[end]]仍然为0,若字符出现过则根据index[s[end]] = end + 1可知index[s[end]] >0,进入if。
- start = index[s[end]]不符合无重复的要求,(start)左边界+1。
- 符合无重复字符的要求,(end)右边界+1
leecode-3无重复字符串的最长子字符串C版-滑动窗口相关推荐
- 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
最初的思路遍历每个字符,找到以它开始的最长的子串.俗称暴力法,确实很暴力,时间复杂度达到O(n^3),唯一的好处是它能解决问题.暴力遍历法的大概流程是准备一个hash字符数组,然后遍历每个字符放到ha ...
- 【LeetCode】不含重复字符的最长子字符串
题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度. 示例 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符 ...
- 1041-不含重复字符的最长子字符串
题目如下 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3. 示例 2: 输入 ...
- 面试题16:不含重复字符的最长子字符串(Java版)
题目:输入一个字符串,求该字符串中不含重复字符的最长子 字符串的长度.例如,输入字符串"babcca",其最长的不含重复字符的子字符串是"abc",长度为3. ...
- c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...
查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答) 给定一个字符串str,找到不重复字符的最长子字符串. 比如我们有 "ABDEFGABEF", 最长的字符串是 ...
- Leetcode之无重复字符的最长字符串
今天的题目主要涉及的是双指针的问题.可能前端同学当听到双指针时可能会有些头皮发麻,难免会想到一些后端知识,其实指针我们也是很常用的.当使用for循环时,例如循环中的变量i则就是一个指针,这道题的解法有 ...
- LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)
1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...
- [转载] 字符串最长重复子串python_查找字符串中重复字符的最长子字符串
参考链接: Python字符串| digits 我尽量不在codeforces问题上寻求帮助,除非我真的,真的,卡住了,现在正好是.在Your first mission is to find the ...
- 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)
[LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...
最新文章
- 集成学习模型(xgboost、lightgbm、catboost)进行回归预测构建实战:异常数据处理、缺失值处理、数据重采样resample、独热编码、预测特征检查、特征可视化、预测结构可视化、模型
- golang确保输入过滤
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
- mysql所支持的比较运算符_mysql比较运算符有哪些?Mysql比较运算符详解
- 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found
- (自连接)SQL面试题-0608
- Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
- java图片上传并解析_java的图片上传详解
- 简记docker用法
- sheet中没有getcolumns()方法吗_痘痘能去除吗?有没有效果比较好的祛痘方法
- Redis 哨兵安装-Centos
- 如何合理使用ClickHouse分区表
- Oracle安装提示无效条目,oracle NET 无效条目,要求有效的“服务名”
- 2021下半年中小学教资考试教育知识与能力试题(中学)——主观题
- Android 性能优化之内存泄漏,使用MATLeakCanary解决问题
- 白话firefox扩展插件权限索取的说明(专业版)
- Djang+layui+ajax 提交表单实例
- iOS ui设计的乐土
- 面向儿童的简易编程工具---Scratch
- 申请中涉及不丧失新颖性宽限期的声明
热门文章
- 布朗的计算机排名,布朗大学计算机工程硕士排名第26(2020年TFE Times排名)
- 手机号正则表达式验证_还不会正则表达式?看这篇!
- linux中pss用法,[Linux] Memory: VSS/RSS/PSS/USS
- pandas从dataframe中选择部分行、列
- pandas隔行计算均值方差(相邻行或隔行的均值/方差)
- java设置方块阴影_边框阴影:box-shadow属性
- houghcircle函数_Hough Circle 变换
- python内存技巧_使用__slots__节省python内存技巧
- Palindrome DP
- 关于oracle sql语句查询时表名和字段名要加双引号的问题详解