代码1
import java.util.*;
import java.lang.Math;
import java.util.Map;
//遇见重复问题,Hash表
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int lengthOfLongestSubstring (String s) {
// write code here
//key= 每个字符 , value = 对应下标(从0)
HashMap<Character , Integer> hash = new HashMap<>();
int res = 0;//结果(最大字串长度)
int left = 0;//左边界
//从第一个字符开始遍历。进行处理
for(int i = 0; i < s.length(); i++){
//获取第i个位置的字符
char c = s.charAt(i);
//判断c是否出现过
//如果c出现过 “abcabcbb" 此时left = b
//i = a , l = b; i = b , l = c; i = c , l = a ;
//故left或者为原来的值,或者为重复值的下一个位置
if(hash.containsKey(c)){
left = Math.max(left , hash.get(c) + 1);
}
//加入c与对应的i
hash.put(c , i);
//更新res
res = Math.max(res , i - left + 1);
}
return res;
}
}
代码2
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*双向
*
* @param s string字符串
* @return int整型
*/
public int lengthOfLongestSubstring (String s) {
int i = 0;//记录遍历位置
int flag = 0;//记录字符串的起始位置
int length = 0;//字符串的长度
int result = 0;//记录返回的结果
while(i < s.length()){//从头到尾遍历字符串
//从flag位置开始查找,判断是否出现重复字符,返回下标pos
//i从0开始
int pos = s.indexOf(s.charAt(i) , flag);
//如果位置i之前存在相同的字符(s.charAt(i))
if(pos < i){
//如果字符串长度>结果的长度,更新
if(length > result){
result = length;
}
//
if(result >= s.length() - pos - 1){
return result;
}
length = i - pos - 1;//遍历字串的长度= 遍历位置-重复位置 -1;
flag = pos + 1;
}
length++;
i++;
}
return length;
}
}