LeetCode刷题记录:3. 无重复字符的最长子串-Longest Substring Without Repeating Characters
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4
输入: s = “”
输出: 0
提示
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
解题思路
滑动窗口算法(sliding window algorithm),随着窗口右端移动,判断进入窗口内的字符在原窗口内是否存在,若存在窗口左端移动至原重复字符的右端。求出整个滑动过程中的窗口长度最大值即为解。
java实现
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0){
return 0;
}
int startFlag = 0;
int endFlag = 0;
int tmpLength = 1;
int result =1;
while(endFlag != s.length()-1){
endFlag++;
tmpLength++;
for(int i =0;i<endFlag-startFlag;i++){
if(s.charAt(startFlag+i)==s.charAt(endFlag)){
tmpLength -=i+1;
startFlag+=i+1;
break;
}
}
result = result>=tmpLength?result:tmpLength;
}
return result;
}
}
相关知识
滑动窗口
窗口的概念就是一个由左右边界划分的一个区域,窗口从左向右滑动,右边进数,左边出数。窗口长度可以变也可以不变,具体问题具体分析。滑动窗口是一个解决线性结构数据的优秀思路。
滑动窗口协议(Sliding Window Protocol)
滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。
参考:滑动窗口协议-百度百科