方法一
将字符串从第一个到最后一个都依次进行遍历,计算起无重复最长子串,并记录,比较长度。
计算无重复最长子串方法:
- 将循环i当作左指针,将r比作右指针
- 设置HashSet可以判断字符重复
- 从i=0开始依次判断字符串
- 如果判断不是重复,将字符加入HashSet并将右指针向右+1
- 如果重复,记录字符长度=右指针-左指针+1=r-i+1
class demo{
public int BestlengthString(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> set= new HashSet<Character>();
int n = s.length();
// 右指针,初始值为 -1,还没有开始移动
int r = -1, res = 0;
for (int i = 0; i < n; ++i) {
//每当左指针i右移时,将HashSet中移除前一个左指针
if (i != 0) {
// 左指针向右移动一格,移除一个字符
set.remove(s.charAt(i - 1));
}
//判断字符是否重复和右指针是否越界
while (r + 1 < n && !set.contains(s.charAt(r + 1))) {
// 不断地移动右指针
set.add(s.charAt(r + 1));
//右移右指针
++r;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
// 判断循环的每一次最长子串,并放入ans
res = Math.max(res , r - i + 1);
}
return res ;
}
}
方法2
通过ASCII码来进行字符的存储,来判断是否有重复字符
方法:
- start:最短字符串起始位置
- res:字符长度
- lastLocation :存储字符上一次出现的位置
- i:遍历字符的位置
- 遍历字符时将其位置存储在数组中
- 将字符长度放在res中当遍历字符时,start会不断的改变,当下一个要遍历的字符在之前有过重复,start就会变为之前重复字符位置的下一位
- 字符长度也会随之改变
图解:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
ASCII码
class demo{
public int BestlengthString(String s) {
// 记录字符上一次出现的位置
//使用字符的ASCII码128位来存储位置
int[] lastLocation = new int[128];
//全都初始化为-1
for(int i = 0; i < 128; i++) {
lastLocation [i] = -1;
}
//字符串的长度
int n = s.length();
//初始化最短字符长度
int res = 0;
//计算最短字符的起始位
int start = 0;
for(int i = 0; i < n; i++) {
//获得每位字符的ASCII码
int index = s.charAt(i);
//比较last数组里字符的位置
start = Math.max(start, lastLocation [index] + 1);
//比较字符长度
res = Math.max(res, i - start + 1);
lastLocation [index] = i;
}
return res;
}
}