当前位置:网站首页>剑指 Offer II 016. 不含重复字符的最长子字符串
剑指 Offer II 016. 不含重复字符的最长子字符串
2022-07-20 05:42:00 【瑾怀轩】
给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子字符串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/wtcaE1
java:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() ==0 || s.length() == 1){
return s.length();
}
//使用长度26的数字作为状态数组
int[] state = new int[128];
for (int i = 0 ;i <128 ; i++){
state[i] = -1;
}
int maxLen = 0;
char[] sChars = s.toCharArray();
//使用双指针进行从左至右遍历
//类似滑动窗口思想,进入一个字母,标记状态数组,记录位置,出去一个字母标记位置-1
//将窗口左侧移动至,重复元素下标后一个元素,
//记录当前字符最大长度
int currMax = 0;
int start = 0;
for(int j = 0 ; j<s.length();j++){
//进入一个字符,计算状态数组下标
int tmp = sChars[j];
//状态数组没有时,长度+1,保存状态数组位置,更新长度
if(state[tmp] == -1){
state[tmp] = j;
currMax++;
if(currMax > maxLen){
maxLen =currMax;
}
}else{
//状态数组存在时,1)记录之前位置k,k+1~j为当前长度,k ~start 的字母出窗。start =k+1
int k = state[tmp];
currMax = j - k ;
while(start <= k){
int help = sChars[start++];
state[help] = -1;
}
start = k +1;
state[tmp] = j;
}
}
return maxLen;
}
}
改进优化:
使用HashSet,代替数组
class Solution {
public int lengthOfLongestSubstring(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i - 1));
}
while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
// 不断地移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i + 1);
}
return ans;
}
}
边栏推荐
- Graduation thesis topics of hydrology and water resources [213]
- Chapter004-FPGA学习之IP核相关功能【时钟、RAM、FIFO】
- 聪明人的游戏提高篇:第三章第一课:grid(格子位置)
- Model thesis of urban planning and design
- Clickhouse failed to start_ Unit clickhouse-server. service entered failed state
- 力扣打卡总结之动态规划
- bgy开发小示例
- 石油工程毕业论文范文
- 剑指offer专项突击版第4天
- Unity实现人物移动和镜头跟随
猜你喜欢
Chapter003 FPGA learning PWM LED breathing lamp
园林专业毕业论文范文
JS构造二叉树
Clickhouse failed to start_ Unit clickhouse-server. service entered failed state
Chapter006 LCD display of FPGA learning
什麼是渲染管道,怎麼繪制3D物體
使用libwebp解码webp静态图片
GD32利用CubeMX构建代码的测试
Model graduation thesis on traffic safety management
Model graduation thesis of Landscape Architecture
随机推荐
TensorFlow的学习笔记(一)
学习笔记-浅谈MySql索引的数据结构与算法和索引的介绍
什麼是渲染管道,怎麼繪制3D物體
关于毕业前后的道路
UGUI——CanvasUpdateRegistry
数据库笔记
vsCode配置Eslint+Prettier结合使用详细配置步骤,规范化开发
WordPress 6.0.1 新版已经发布,建议全部更新。
RIoTBoard开发板系列笔记(五)—— 移植u-boot
力扣打卡总结之动态规划
回到原点:重新开始学习
mark down学习
建筑装饰毕业论文题目
Title of graduation thesis on architectural decoration
使用libwebp解码webp静态图片
力扣总结之链表题目
剑指offer专项突击版第3天
结合源码看《我所理解的cocos2dx-3.0》—— 内存管理
Markdown中编辑数学公式
GD32利用CubeMX构建代码的测试