1.题目描述
2.思路
思路1:在字符串 s 中寻找最长的无重复字符子串的长度,它使用了 滑动窗口 和 HashMap 记录字符索引 的方法。
例子1:
总结:用hashmap记录键值对,键唯一,但是值可以不同。
start来更新索引,也就是遇到重复字符,说明按此顺序的字符有重复。我们应该跳到下一个字母继续执行。
补充1:
··············································································
补充2
·······························································
3.代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
//1.定义一个哈希表,哈希表可以满足键唯一,值不同.存储字符和字符的索引
//对应到字符串就是字母一样,但是索引可以不动
HashMap<Character,Integer> s1=new HashMap<>();
//2.初始化无重复字符串的最大长度
int maxLen=0;
int start=0;
for(int i=0;i<s.length();i++)
{
char letter=s.charAt(i);
//3.处理遇到重复的字符的子字符串。查找哈希表中现有的键是不是有该字符
// 如果字符 letter在 HashMap 里,并且索引大于等于 start,就更新 start
//比如abca,因为start=0,第四个a第二次遇到因为索引是0,等于第一次遇到的a,索引为0,但是此时用大于号,start不更新
if(s1.containsKey(letter)&&s1.get(letter)>=start)
{
start=s1.get(letter)+1;
//4.更新遇到重复字符的索引
}
// 记录当前字符的索引
s1.put(letter,i);
//4.计算当前不重复的字符串的长度
int currLen=i-start+1;
maxLen=Math.max(currLen,maxLen);
}
return maxLen;
}
// public static void main(String args[])
// {
// Solution07 test=new Solution07();
// String s1="abcdeasdfgh";
// int num=test.lengthOfLongestSubstring(s1);
// System.out.println("返回无重复字符串的长度"+num);
// }
}