T3. Longest Substring Without Repeating Characters 【Medium】
题目
给出一个字符串(String),找到字符串中无重复的最长串长度
Example
输入"abcacbbb",最长串是"abc",长度是3
输入"bbbbb",最长串是"b",长度是1
输入"pwwkew",最长串是"wke",长度是3
思路
主要就是查重和计算长度,看代码注释就好了~
代码
代码参考 Top Solution,稍作注释
public int lengthOfLongestSubstring(String s) {
//如果输入长度是0,则返回0
if (s.length()==0) return 0;
//初始化HashMap
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
//初始化最大长度
int max=0;
//其中i是在读字符的编号,j是无重复字符串的开始编号
for (int i=0, j=0; i<s.length(); ++i){
//通过这个查前面是否有重复
if (map.containsKey(s.charAt(i))){
/**
*若重复且比j大,则把开始字号转为重复字的后一个。
*由于map没有清空,当出现acbac时,虽然从a开始,
*c也会发现重复,但是此时不应该把j置为第二个c的编号
*/
j = Math.max(j,map.get(s.charAt(i))+1);
}
//把字符存入map
map.put(s.charAt(i),i);
//通过比较i-j+1和max大小,选出最大的长度
max = Math.max(max,i-j+1);
}
return max;
}
补充
关于 Map 以及它的常用方法
(前面也补充过,leetcode第一题里用到了,有兴趣也可以看看)
map储存的是键(KEY)值(VALUE)对,简单介绍一下它在代码中出现的方法
put(object key,object value);//存入
get(object key);//根据key值找出对应的value值
containsKey(object key);(判断键是否存在)
containsValue(object value);(判断值是否存在)