动态规划
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
[a,b,c,d,b,e] =4
a b c d b e
设置left和right分别为起点和终点。看看【left,right】是否有重复的字符
当Left是a时,移动right指针。到right索引为4时,发现和前面的b相同。之前的串已经包括了。设置变量maxofsub,此时记录maxofsub=4。
移动Left指针,把b从subString子串中剔除出去,因为就算是计算,从Left=b,到写一个b的子串的长度还是比4小。
移动Left指针到c,b出去,c之后的b可以进来了。直到看完所有的字符。
现在的问题是怎么判断substring的字符已经是被访问过的。
用一个方法去判断
boolean[128] used。里面默认的时false
max=0;
推导一下过程:
①:不移动left指针,而是移动right指针
a b c d b e
f f f f f
T T T T F
在b的时候更新max的结果=max(max,right-left)
第二次移动left指针移位,并且移动right指针
left此时指的是a,和①的b没有重复
left向下指,此时为b
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null||s.length()==0) return 0;
//定义一个左指针和右指针
int left=0,right=0;
int n=s.length();//获得字符串的长度
//注意,因为是基本数据类型,所以used数组索引的值默认是false
boolean[] used=new boolean[128];
int max=0;
while(right<n){
//charAt()方法用于返回指定索引处的字符
if(used[s.charAt(right)]==false){
used[s.charAt(right)]=true;
right++;
}
else{
max=Math.max(max,right-left);
while(left<right&&s.charAt(right)!=s.charAt(left)){
used[s.charAt(left)]=false;
left++;
}
left++;
right++;
}
}
max=Math.max(max,right-left);
return max;
}
}
跑出来的结果还是稍微差了点,第一次刷leetcode,感谢basketwangcoding提供算法思路
有空的话,我还会多看看的leetcode评论区的题解,并且优化代码。谢谢~~~~~~