题目:输入一个字符串,求该字符串中不含重复字符的最长子字符串的长度。例如,输入字符串"babcca",其最长的不含重复字符的子字符串是"abc",长度为3。
针对字符类的题目,我们似乎都可以复用如下思路(变位词问题),
1 先将已知的字符串存放于某个容器中,通常初次存放即+1
2 通过控制双指针 加值 or 减值
ok,针对这个题目,我们需要先将字符串全部映射到容器中去。同时将双指针同时指向首元素
关于重复这个现象,转化到容器中的体现便是获取到这个字符的数字是大于1的。
那么也就是说,如果我们一旦发现某个字符重复次数大于1,我们必须移动左指针向右边移动直到减去这个重复次数为止
public static void main(String[] args) {
String ss = "babcca";
System.out.println(lengthOfLongestSubstring(ss));
}
public static int lengthOfLongestSubstring(String s) {
int result = 0;
//左指针
int j = -1;
int repeatTimes = 0;
//初始化容器
int[] counts = new int[256];
//右指针
for (int i= 0; i <s.length() ; i++) {
//将字符串每个字符渲染+1
//与变位词不同的是,这里是单字符串且无位置特殊性,
//无需counts[s1.charAt(i)-'a']
counts[s.charAt(i)]++;
//如果存在渲染数量 = 2 说明已经首次出现重复 需要解决
if (counts[s.charAt(i)] == 2){
//记录重复数量
repeatTimes = repeatTimes +1;
}
//如果存在重复情况
while (repeatTimes>0){
//左指针向右移动并进行扣减
j = j+1;
//从这里可以看出,这里只关心值为1的 其他的无所谓
counts[s.charAt(j)]--;
if (counts[s.charAt(j)] == 1){
repeatTimes = repeatTimes -1;
}
}
result = Math.max(i- j,result);
}
return result;
}