广州网站服务,做网页的app,网站开发费用会计分录,贸易公司网站案例题目描述
给定一个字符串 s #xff0c;请你找出其中不含有重复字符的 最长
子串 的长度。 示例 1:
输入: s abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 abc#xff0c;所以其长度为 3。示例 2:
输入: s bbbbb
输出: 1
…题目描述
给定一个字符串 s 请你找出其中不含有重复字符的 最长
子串 的长度。 示例 1:
输入: s abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 abc所以其长度为 3。示例 2:
输入: s bbbbb
输出: 1
解释: 因为无重复字符的最长子串是 b所以其长度为 1。示例 3:
输入: s pwwkew
输出: 3
解释: 因为无重复字符的最长子串是 wke所以其长度为 3。请注意你的答案必须是 子串 的长度pwke 是一个子序列不是子串。
解题思路
1.思路 最自然的思路是暴力求解法遍历字符串每个字符位置求解该位置的最长子串二次优化是借助KMP算法不需要遍历字符串而是从与当前字符冲突的位置开始再次遍历。
然后发现滑动窗口法是最适合解决当前问题的方法滑动窗口算法思路如下 当 window[c] 值大于 1 时说明窗口中存在重复字符不符合条件就该移动 left 缩小窗口了。
另外要在收缩窗口完成后更新 res因为窗口收缩的 while 条件是存在重复元素换句话说收缩完成后一定保证窗口中没有重复。
代码
class Solution {public int lengthOfLongestSubstring(String s) {MapCharacter, Integer window new HashMap();int left 0, right 0;int res 0; // 记录结果while (right s.length()) {char c s.charAt(right);right;// 进行窗口内数据的一系列更新window.put(c, window.getOrDefault(c, 0) 1);// 判断左侧窗口是否要收缩while (window.get(c) 1) {char d s.charAt(left);left;// 进行窗口内数据的一系列更新window.put(d, window.get(d) - 1);}// 在这里更新答案res Math.max(res, right - left);}return res;}
}