Leetcode-至多包含两个不同字符的最长子串
题目:给定一个字符串 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-至多包含两个不同字符的最长子串相关推荐
- LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: ...
- 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece&quo ...
- LeetCode 159. 至多包含两个不同字符的最长子串 (滑动窗口哈希表)
159. 至多包含两个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {// 记录 ...
- 【LeetCode - 159】至多包含两个不同字符的最长子串
文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路 如果输入字符串 s 的长度小于等于 2,那么它自己就是"至多包含两个不同字符的最长子串",返回 ...
- 滑动窗口—至多包含两个不同字符的最长子串(leetcode 159)
题目描述 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ec ...
- leetcode159. 至多包含两个不同字符的最长子串
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t . 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece",长度为3. 示 ...
- 159 至多包含两个不同字符的最长子串
题目描述: 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "e ...
- Leetcode——至多包含K个不同字符的最长子串
1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...
- 159. 至多包含两个不同字符的最长子串
题目 给定字符串s,找最多包含两个不同字符的子串,且需要子串最长 类似 3. 无重复字符的最长子串 https://blog.csdn.net/weixin_51125132/article/de ...
- Leecode159:至多包含两个不同字符的最长子串
m.clear() //清空哈希表 这道题也是使用滑动窗口来解决,我使用的还是Leecode3的那种方法,虽然AC了但是性能不太好, 看官方题解使用的. 忘记了1种情况:到了最后还是一个/两个但是没有 ...
最新文章
- WINCE注册表应用
- RabbitMQ持久化交换机队列
- 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
- WindowsPhone 7.8 Tiles 1 : WideTile
- oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...
- srv.sys蓝屏解决补丁_Win10 补丁 KB4556799 导致部分用户蓝屏死机和网络问题
- 一个报文的路由器之旅_一个报文的路由器之旅
- 计算机网络中的传输协议是_计算机网络中的传输方式
- 阿里技术面:ReadWriteLock读写之间互斥吗?
- Practical Tactics for Social Intercourse One
- PlatformTransactionManager
- 【路径规划】基于matlab人工蜂群优化粒子群算法求解最短路径规划问题【含Matlab源码 124期】
- 524.通过删除字母匹配到字典里最长的单词(力扣leetcode) 博主可答疑该问题
- js vue echarts 前端绘制 cie1931 马蹄图 色度图
- 你一定要上网,看到这段文字,做一…
- linux 分区表 修复工具,介绍一个 GPL 的分区表修复工具 TestDisk
- Objective C Bridging header —— swift MD5
- NCRE考试感想 三级信息安全(下)
- 视觉特效专家24点行业工作经验总结
- 如何设置显示网络计算机,如何在台式计算机上设置无线局域网络
热门文章
- 数据库与MPP数仓(二十三):postgreSQL集群与高级特性
- IDEA SpringBoot 同一个模块启动多个服务(实例)
- 《Android 应用案例开发大全(第二版)》——1.5节第一个Android程序——Hello Android...
- 网络流量分析 NetFlow是什么 详解 科普 ~互联网业务流量监测技术的应用和设计---perfect
- java 中PATH, -classpath, -Djava.library.path 的功能和区别
- 搞笑漫画:程序员的逻辑
- 简单地获得UTM坐标系
- 2023届双非硕士四个月秋招历程总结
- 曾经开发的一个武冈市市民意见采集系统
- 光时域反射仪的选择应该从哪些方面考虑?