解题思路:
这时一个典型的适用滑动窗口的题目。
1.首先初始一个快慢指针i 和 j, j 比 i 快一步。
2.根据i , j 指针来切割出子串,利用循环实时更新子串的长度。
(特别注意 利用substring( i , j )方法时,i下标可取,而 j下标取不到)
3.在循环中,再定义一个循环利用 n指针将子串中的每一个字符与将要新加入的字符进行比对,
比对产生两种情况:
情况 一:子串的每一个字符都与新要加入的字符不同,则加入新字符,进入下一轮循环。
情况 二: 子串中有一个字符与新要加入的字符相等,则更新i的位置 下标为 n+1,这时则直接退出内层循环。
最后等到 j指针指向末尾,退出外层循环。即可得到最大长度的无重复字符串。
代码部分:
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
if (len==0){ //排除空串的情况
return 0;
}
int sum = 1; //用于记录最长的无重复字串
int i = 0, j = 1; // 用指针动态的切割字串
while(j<len){
String temp = s.substring(i,j); //根据i,j指针下标来确定所分割的子串长度
int e = temp.length();
int n = 0; //指针
while(n<e){
if(temp.charAt(n)==s.charAt(j)){ //判断字串中是否有与将要新加入的字符重复
i +=n+1; //重复则将 i指针移动到 n的前一个位置 即 n+1
break; //i产生滑动,直接退出匹配的循环。
}
n++;
}
sum = Math.max(sum,j-i+1); //更新最长子串的长度
j++;
}
return sum;
}
}