请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
注意:本题与主站 3 题相同:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
标准双指针划窗解法。由于题目没有明确说明只包含asc字符,为了避免出现汉字等情况,需要用set来存储,而不能为了节省往set中添加和删除数据等时的时间开销而用数组代替。
class Solution { public int lengthOfLongestSubstring(String s) { // 存储窗口中出现的字符。 Set<Character> set = new HashSet<>(); // 左指针,保存当前窗口开始时的位置。 int p = 0; char[] arr = s.toCharArray(); int res = 0; // i是右指针,保存当前窗口结束的位置。由于本题中,右指针只需要向右移动,不需要回退,所以直接用i代替。 for (int i = 0; i < arr.length; i ++) { // 如果遇到窗口中已经存在字符了,那么一直移动左指针,直到窗口将该字符吐出来,维护窗口中字符的唯一。 while (set.contains(arr[i])) { set.remove(arr[p]); p ++; } set.add(arr[i]); // 更新答案。 res = Math.max(res, set.size()); } return res; } }
标签:子串,字符,arr,set,48,Offer,int,res,--- From: https://www.cnblogs.com/allWu/p/17219352.html