1. Algorithm:
难度:中等
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
- 这道题我看到不重复第一反应是用hashmap来做.遍历一遍代码如下
class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
Map map = new HashMap<String, String>();
for (int i = 0; i < s.length(); i++) {
if (!map.containsKey(s.charAt(i))) {
map.put(s.charAt(i), i);
} else {
if (map.size()>maxLength) {
maxLength = map.size();
}
i = (int)map.get(s.charAt(i));
map.clear(); //记录下length,找到相同字符的位置,并清空map,并从charAt开始遍历
}
}
return map.size()>maxLength?map.size():maxLength;
}
}
看了大佬的题解,感觉有几点需要改进,这种只关心长度,我们只需要定义两个指针就可以了.头指针永远指向最新值,尾指针指向不重复的最新值.这样头-尾就是我们需要的长度.
public int lengthOfLongestSubstring(String s) {
int max = 0;
int start = 0, end = 0; //定义前指针,后指针指向最新的值,后指针指向不重复的最小下标
//定义map来标定是否有元素重复,如果重复就移动后指针到不重复的最小下标,
Map map = new HashMap<Character, Integer>(16);
while(start < s.length()) {
char c = s.charAt(start);
if (map.containsKey(c)) {//如果包括,证明后指针到前指针位置之后的长度为最大
//拿到当前的不重复长度和max做比较.
max = Math.max(max,start-end);
//更新后指针,如果比后指针当前位置靠左就是冗余数据,指针不更新.
end = Math.max((int)map.get(c)+1,end);
}
//更新map的最新value值
map.put(c, start);
start++;
}
//否则返回,前指针到后指针位置和max中的较大值
return Math.max(max,start-end);
}
2.Review:
翻译单独写成博客以后.
3.Tip:
这周分享一个关于线上统一日志的方式.
背景:log4j2+slf4j线上日志太多,无法知道哪个请求对应哪个响应.无法一步步定位日志.
解决方式:
使用aop的方式,定义统一切面.使用log4j的MDC自定义变量,在before中生成requestId(唯一标识),在after中remove掉.并在log4j的规则中配置统一变量.这样就在不改变原有代码逻辑下,优雅的配置了统一日志!!
4.Share:
分享一篇唐扬老师关于[如何保证消息之投递一次]