要求:给定一个字符串 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);}

代码中学到的东西:

  1. char index[128] = {0}; 将所有128个数都赋为0
  2. index[s[end]] = end + 1; 记录字符出现的位置。其中s[end]可以是字符也可以是数字。每个字符或者数字都要对应的asllic码。这样就可以确认字符或者数字出现的位置。
  3. 利用if(index[s[end]]> start) 来确认字符是否重复出现过,start开始为0,若字符没出现过则index[s[end]]仍然为0,若字符出现过则根据index[s[end]] = end + 1可知index[s[end]] >0,进入if。
  4. start = index[s[end]]不符合无重复的要求,(start)左边界+1。
  5. 符合无重复字符的要求,(end)右边界+1

leecode-3无重复字符串的最长子字符串C版-滑动窗口相关推荐

  1. 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法

    最初的思路遍历每个字符,找到以它开始的最长的子串.俗称暴力法,确实很暴力,时间复杂度达到O(n^3),唯一的好处是它能解决问题.暴力遍历法的大概流程是准备一个hash字符数组,然后遍历每个字符放到ha ...

  2. 【LeetCode】不含重复字符的最长子字符串

    题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度. 示例 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符 ...

  3. 1041-不含重复字符的最长子字符串

    题目如下 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3. 示例 2: 输入 ...

  4. 面试题16:不含重复字符的最长子字符串(Java版)

    题目:输入一个字符串,求该字符串中不含重复字符的最长子 字符串的长度.例如,输入字符串"babcca",其最长的不含重复字符的子字符串是"abc",长度为3. ...

  5. c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

    查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答) 给定一个字符串str,找到不重复字符的最长子字符串. 比如我们有 "ABDEFGABEF", 最长的字符串是 ...

  6. Leetcode之无重复字符的最长字符串

    今天的题目主要涉及的是双指针的问题.可能前端同学当听到双指针时可能会有些头皮发麻,难免会想到一些后端知识,其实指针我们也是很常用的.当使用for循环时,例如循环中的变量i则就是一个指针,这道题的解法有 ...

  7. LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)

    1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...

  8. [转载] 字符串最长重复子串python_查找字符串中重复字符的最长子字符串

    参考链接: Python字符串| digits 我尽量不在codeforces问题上寻求帮助,除非我真的,真的,卡住了,现在正好是.在Your first mission is to find the ...

  9. 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)

    [LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...

最新文章

  1. 集成学习模型(xgboost、lightgbm、catboost)进行回归预测构建实战:异常数据处理、缺失值处理、数据重采样resample、独热编码、预测特征检查、特征可视化、预测结构可视化、模型
  2. golang确保输入过滤
  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
  4. mysql所支持的比较运算符_mysql比较运算符有哪些?Mysql比较运算符详解
  5. 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found
  6. (自连接)SQL面试题-0608
  7. Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
  8. java图片上传并解析_java的图片上传详解
  9. 简记docker用法
  10. sheet中没有getcolumns()方法吗_痘痘能去除吗?有没有效果比较好的祛痘方法
  11. Redis 哨兵安装-Centos
  12. 如何合理使用ClickHouse分区表
  13. Oracle安装提示无效条目,oracle NET 无效条目,要求有效的“服务名”
  14. 2021下半年中小学教资考试教育知识与能力试题(中学)——主观题
  15. Android 性能优化之内存泄漏,使用MATLeakCanary解决问题
  16. 白话firefox扩展插件权限索取的说明(专业版)
  17. Djang+layui+ajax 提交表单实例
  18. iOS ui设计的乐土
  19. 面向儿童的简易编程工具---Scratch
  20. 申请中涉及不丧失新颖性宽限期的声明

热门文章

  1. 布朗的计算机排名,布朗大学计算机工程硕士排名第26(2020年TFE Times排名)
  2. 手机号正则表达式验证_还不会正则表达式?看这篇!
  3. linux中pss用法,[Linux] Memory: VSS/RSS/PSS/USS
  4. pandas从dataframe中选择部分行、列
  5. pandas隔行计算均值方差(相邻行或隔行的均值/方差)
  6. java设置方块阴影_边框阴影:box-shadow属性
  7. houghcircle函数_Hough Circle 变换
  8. python内存技巧_使用__slots__节省python内存技巧
  9. Palindrome DP
  10. 关于oracle sql语句查询时表名和字段名要加双引号的问题详解