难度:挺难的,做了很多次才做出来
个人不足:一开始没有考虑到遇到重复字符X之后,开始计算距离位置要 从X之后一个开始
当然 所用 方法是HashMap,是一条可行之路
思路:
01
距离为当前读取字符串位置,和开始位置start
开始位置start会出现在哪呢 ? 就是上一个和读取字符 相同的后一个
所以每次遇到都需要修改start指针 比如 abgcbdefc
当读到c时,start开始在 b后面一个[2],当遇到c 在[3]位置已经有了c,
那么比较的就是 上一次start和此时与读取字符串X相同的上一个字符后一个的大小——选择大的
02
将字符依次保持入哈希表中,(将已读取 的k值的 v设为同一个)
每次都要将字符 与字符在字符串中的位置 加入HashMap中 因hashMap会 保持key的不重复。
03计算距离
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer>map = new HashMap();
HashMap<Character,Integer> hash=new HashMap<>();
//String s="pwwkew";//abba
char[] strToChar=s.toCharArray();
int res=0;
int start=0;
for (int i = 0; i <strToChar.length ; i++) {
if(hash.containsKey(strToChar[i])){
//如果哈希表存在某元素x
/*res=Math.max(res,i-start);*///求开始计算位置 与 i的距离
//start=hash.get(strToChar[i])+1;//既然到这一步 说明有重复,所以start会变化
start=Math.max(start,hash.get(strToChar[i])+1);
}
hash.put(strToChar[i],i);//后续一直加 则需要不断加1
res=Math.max(res,i-start+1);
}
return res;
}
}
if( hash.containsKey(s.charAt(i) ) ){
//有重复 就计算距离 那么如何求距离呢
//start=hash.get(s.charAt(i) )+1;//这里为什么要+1 呢 因为后面一步会更新i的值 i对应的key会是最新的,所以要将上一个start进一位 否则将会包含两个同样的字符
//如果重复字符之间包括了另外一对重复字符 那么稍远的一组 的start应该还要为最大的那个 如
//abba 到最后一个a时, start应该要为最大的位置 即在b 而不能回到a ——————0
start=Math.max(start,hash.get(s.charAt(i) )+1);
}