题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
题解:运用滑动窗口算法,滑动窗口算法可以解决数组/字符串的子元素问题,将嵌套循环问题转为单循环问题,降低时间复杂度。
在这一题中,窗口的大小是未知的。假设窗口左端指针为left,右端指针为right。只要窗口中没有重复元素,right就要向右继续移动。如果找到了重复元素,就要将left移动到窗口中重复元素的下一个位置,接着继续上述操作。在这里,关键就在于找到子串中重复元素的位置。这可以运用java中String类自带的方法来解决。
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0||s==null){
return 0;
}
int left=0;//记录窗口左端下标
int right=1;//窗口右端下标,同时用来作为移动窗口的指针
int location=-1;//记录重复元素在子串中的下标
int len=1;//记录当前子串的长度
int res=1;//记录最终结果
while(left<s.length()&&right<s.length()){
//查找right所指的元素在当前子串中的位置
location=s.substring(left,left+len).indexOf(s.charAt(right));
if(location==-1){//location等于-1意味着right所指元素和前面的元素都不重复
len++;
res=Math.max(res,len);
}else{//重复了就要更新left和len
left=left+location+1;
len=right-left+1;
}
right++;//无论如何都要将right继续右移
}
return res;
}
}
无重复字符的最长子串
原文:https://www.cnblogs.com/xbc121/p/12038194.html