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

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
注意:答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路:

  1. 开始时两个指针first,second均指向数组起始元素,将tag数组元素全部置0。
  2. 让second向后遍历,并同时使当前子串长sizej自增。若second遇到之前未出现的元素x,就将tag[x]置为1,表示元素x出现了。
  3. 继续遍历若重新遇到了元素x(可通过tag[x]是否非0判断),就将当前子串长size与最长子串长maxsize进行比较然后更新maxsize。接下来需要跳过不可能在后续子串中出现的部分。
  4. 做一个一重循环找到之前出现的x再使first指向其后继元素。循环过程中每使first自增一次就使size自减一次。
  5. 执行1,2,3直至数组末尾
  6. 最后一次的maxsize可能并未更新,再做一次比较

代码部分

int lengthOfLongestSubstring(char * s){
    int len = strlen(s);
    if(len == 1){
        return len;
    }
    char *first,*second;
    first = second = s;
    char tag[128] = {0};
    int maxsize=0,size=0;
    while(second < s + len){
        if(!tag[*second]){
            tag[*second] = 1;
            size++;
            second++;
        }else{
            if(maxsize < size)
                maxsize = size;
            while(*first != *second){
                tag[*first] = 0;
                first++;
                size--;
            }
            first++;
            second++;
        }
    }
    if(maxsize < size)
        maxsize = size;
    return maxsize;
}

本文由 管理员 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论