无重复字符最大子串

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

示例 1:

输入: "abcabcbb"

输出: 3

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

示例 2:

输入: "bbbbb"

输出: 1

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

示例 3:

输入: "pwwkew"

输出: 3

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

     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

int lengthOfLongestSubstring(char *s){

    char *p;

    char *off;

    int len = strlen(s);

    int max = -1;

    if (len <= 1) { /* 入参检查 */

        return len;

    }

    for (p = s; p < s + len;) {

        int temp[127] = {0};

        int count = 1;

        temp[*p] = count;

        for (off = p + 1; off < s + len; off++) {

            if (temp[*off] != 0) {

                break;

            } else {

                temp[*off] = count++; /* 里面保存下一次p的增加步长 */

            }

        }

        if (max == 95) { /* 这个条件优化最明显 */

            return 95;

        } else if (count > max) {

            max = count;

        }

        /* off不是遇见已存在的字符退出的,说明结束了 */

        if (temp[*off] == 0) {

            return max;

        }

        p += temp[*off];

    }

    return max;

}

temp数组的下标不使用temp[*off - 0]的方式,采用编译器的类型转换。

ASCII码中非控制类可见字符就95个,达到这个数据直接return,减少耗时最多。

p增加的步长就是官方分析,不要加一的方式,采用跳步,直接跳到数组中重复字符的下一个位置,巧妙使用计数

作者:wang-yong-hao

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/cma-suo-jian-hao-shi-shi-jian-fang-fa-by-wang-yong/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容