题目:给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。

思路:使用hash表的优点在于,使用数组存储正在找的字符,用两个数组就很方便。统计个数也好,还是替代也好。其实看到这个题目,就知道有三种情况,第一种,表中只有两种字符以下的情况,只需要把新来的加入表中,或者把已存在的加入表中。第二种,表中有两个字符,但是新来的是这两个字符中的一个,此时只需要加个数。第三种,也是最复杂的,就是已经有两个了,但是新来的字符不同,因此,需要消掉第一个字符,第一个字符是哪个,有几个,怎么消除。就是这个题目的难点。

#define HASHNUM 128 //Z ASCII码值为127int CheckHashNum(const int *hashArry)
{int valueNum = 0;if (hashArry == NULL) {return false;}for (int i = 0; i < HASHNUM; i++) {if (hashArry[i] != 0) {valueNum++;}}return valueNum;
}int Max(const int Num1, const int Num2)
{if (Num1 >= Num2) {return Num1;} else {return Num2;}}int lengthOfLongestSubstringTwoDistinct(char * s){if (s == NULL) {return false;}int maxNum = 0;int nowNum = 0;int start = 0;int cnt = 0;int strLen = strlen(s);int hash[HASHNUM] = {0};for (int i = 0; i < strLen; i++) {cnt = CheckHashNum(hash);/*情况一,hash表只有一个种字符,处理完继续处理下一个,因此带contiue*/if (cnt < 2) {hash[s[i]]++;nowNum ++;maxNum = Max(maxNum, nowNum);continue;} /*情况二,hash表有两个不同的字符,但是接下来的字符是其中之一,也加入hash中,处理完continue*/if (cnt == 2) {if ((hash[s[i]] != 0)) {hash[s[i]]++;nowNum ++;maxNum = Max(maxNum, nowNum);continue;}}/*情况三,hash中有两种字符,但是接下来的字符不同于两种字符,因此去掉最头的字符,此处hash表的优势就体现出来了,因此没有用两个指针移动的形式,而是用hash表以数组的形式存储,用指针的形式的化,如果两个不同字符不是连续的,还要判断第一个字符最后一次出现在哪里*/while (CheckHashNum(hash) >= 2 && start < strLen) {hash[s[start]]--;start++;nowNum--;}hash[s[i]]++;nowNum++;maxNum = Max(maxNum, nowNum);}return maxNum;
}

写代码途中的误区,这个continue,脑袋中一定要把逻辑理清,什么时候停,什么时候往下面跑

cnt = CheckHashNum(hash);/*情况一,hash表只有一个种字符,处理完继续处理下一个,因此带contiue*/if (cnt < 2) {hash[s[i]]++;nowNum ++;maxNum = Max(maxNum, nowNum);continue;} /*情况二,hash表有两个不同的字符,但是接下来的字符是其中之一,也加入hash中,处理完continue*/if (cnt == 2) {if ((hash[s[i]] != 0)) {hash[s[i]]++;nowNum ++;maxNum = Max(maxNum, nowNum);continue;}}

Leetcode-至多包含两个不同字符的最长子串相关推荐

  1. LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: ...

  2. 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)

    给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece&quo ...

  3. LeetCode 159. 至多包含两个不同字符的最长子串 (滑动窗口哈希表)

    159. 至多包含两个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {// 记录 ...

  4. 【LeetCode - 159】至多包含两个不同字符的最长子串

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路   如果输入字符串 s 的长度小于等于 2,那么它自己就是"至多包含两个不同字符的最长子串",返回 ...

  5. 滑动窗口—至多包含两个不同字符的最长子串(leetcode 159)

    题目描述 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ec ...

  6. leetcode159. 至多包含两个不同字符的最长子串

    给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t . 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece",长度为3. 示 ...

  7. 159 至多包含两个不同字符的最长子串

    题目描述: 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "e ...

  8. Leetcode——至多包含K个不同字符的最长子串

    1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...

  9. 159. 至多包含两个不同字符的最长子串

    题目 给定字符串s,找最多包含两个不同字符的子串,且需要子串最长 类似   3. 无重复字符的最长子串 https://blog.csdn.net/weixin_51125132/article/de ...

  10. Leecode159:至多包含两个不同字符的最长子串

    m.clear() //清空哈希表 这道题也是使用滑动窗口来解决,我使用的还是Leecode3的那种方法,虽然AC了但是性能不太好, 看官方题解使用的. 忘记了1种情况:到了最后还是一个/两个但是没有 ...

最新文章

  1. WINCE注册表应用
  2. RabbitMQ持久化交换机队列
  3. 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
  4. WindowsPhone 7.8 Tiles 1 : WideTile
  5. oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...
  6. srv.sys蓝屏解决补丁_Win10 补丁 KB4556799 导致部分用户蓝屏死机和网络问题
  7. 一个报文的路由器之旅_一个报文的路由器之旅
  8. 计算机网络中的传输协议是_计算机网络中的传输方式
  9. 阿里技术面:ReadWriteLock读写之间互斥吗?
  10. Practical Tactics for Social Intercourse One
  11. PlatformTransactionManager
  12. 【路径规划】基于matlab人工蜂群优化粒子群算法求解最短路径规划问题【含Matlab源码 124期】
  13. 524.通过删除字母匹配到字典里最长的单词(力扣leetcode) 博主可答疑该问题
  14. js vue echarts 前端绘制 cie1931 马蹄图 色度图
  15. 你一定要上网,看到这段文字,做一…
  16. linux 分区表 修复工具,介绍一个 GPL 的分区表修复工具 TestDisk
  17. Objective C Bridging header —— swift MD5
  18. NCRE考试感想 三级信息安全(下)
  19. 视觉特效专家24点行业工作经验总结
  20. 如何设置显示网络计算机,如何在台式计算机上设置无线局域网络

热门文章

  1. 数据库与MPP数仓(二十三):postgreSQL集群与高级特性
  2. IDEA SpringBoot 同一个模块启动多个服务(实例)
  3. 《Android 应用案例开发大全(第二版)》——1.5节第一个Android程序——Hello Android...
  4. 网络流量分析 NetFlow是什么 详解 科普 ~互联网业务流量监测技术的应用和设计---perfect
  5. java 中PATH, -classpath, -Djava.library.path 的功能和区别
  6. 搞笑漫画:程序员的逻辑
  7. 简单地获得UTM坐标系
  8. 2023届双非硕士四个月秋招历程总结
  9. 曾经开发的一个武冈市市民意见采集系统
  10. 光时域反射仪的选择应该从哪些方面考虑?