给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。