无重复字符的最长字串
- .
- 题目链接
- 题目详情
- 算法原理
- 题目解析
- 滑动窗口
- 定义指针
- 进窗口
- 判断
- 出窗口
- 更新结果
- 我的答案
.
题目链接
无重复字符的最长字串
题目详情
算法原理
题目解析
首先,为了使字符串遍历的更加方便,我们选择将字符串转换为数组
题目要求子串中不能有重复的字符,因此,我们可以利用hash表来校验是否重复,这里我们采用数组来模拟hash表
滑动窗口
者道题我们使用的是滑动窗口的思想,大致逻辑如图
定义指针
因为窗口需要两个指针来维护窗口的边界,且两个指针都需要对数组进行从左往右的遍历操作,因此,我们定义left和right两个指针,初始值都为0
进窗口
这里的进窗口操作,可以理解为将hash表中的值进行+1操作
判断
这里的判断,主要是校验刚刚进行hash表+1操作之后的值,如果>1,说明hash表中出现了重复的字符,即不满足条件,需要出窗口
出窗口
这里的出窗口操作,就是将hash表中的left值除去,并将left往后移动一位.
完成操作之后,继续进行判断,如果已经没有重复的字符,就进行进窗口操做,直到right到达数组边界
更新结果
这里需要注意,题目要求无重复字符的最长字串,因此需要记录一下,hash表中的数据处于合法状态的时候,最长字串的长度
我的答案
class Solution {
public int lengthOfLongestSubstring(String ss) {
//将字符串转换为数组
char[] s = ss.toCharArray();
//利用数组模拟哈希表
int [] hash = new int [128];
//定义指针
int left = 0,right = 0,n=s.length,ret = 0;
while(right<n){
//进窗口(right加入hash表))
hash[s[right]]++;
//判断hash表中是否有与当前right重复的数
while(hash[s[right]]>1){
//不满足条件,出窗口(left移除hash表),直到将与right重复的数被移除
hash[s[left++]]--;
}
//当前hash表合法,可以更新结果
ret = Math.max(ret,right-left+1);
//为下一次进窗口做准备
right++;
}
return ret;
}
}