LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

 

题目描述

 

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

 

解题思路

 

采用双指针的思想,维护两个指针i、j,i为无重复子串的右端点,j为无重复子串的左端点,这样此子串的长度为i-j+1.再用哈希的思想维护一个大小为128的数组,其下标代表ASCII码共128个字符,下标对应的值记录当前字符最后一次出现位置的后一个位置。这样做的目的是在子串中遇到重复的字符时,下一个无重复子串一定不包含左边的重复字符,所以直接从左边重复字符的后一个位置继续寻找。令哈希数组初始全为0,这样i每次向后走一步,

  • 若i指向的字符在j~i-1的字符串中出现,即哈希数组中当前字符下标对应位置大于j,则j指向左边重复字符的后一个位置,否则j不动
  • 接着计算当前无重复子串的长度并更新最大长度
  • 最后修改哈希数组,使当前字符下标对应值为当前位置+1

 

代码

 

 1 class Solution {
 2 public:
 3     int lengthOfLongestSubstring(string s) {
 4         int idx[128] = {0};
 5         int maxLen = 0;
 6         for(int i = 0, j = 0; i < s.size(); i++){
 7             j = max(idx[s[i]], j);
 8             maxLen = max(i-j+1, maxLen);
 9             idx[s[i]] = i+1;
10         }
11         return maxLen;
12     }
13 };

 

posted @ 2018-06-05 21:08  FlyingWarrior  阅读(136)  评论(0编辑  收藏  举报