无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
思路
哈希表判断子字符串是否重复 双指针i, j 往后遍历,如果找到第一个重复的字符,i++, j 回溯到 i 的位置,然后接着判断。
其间两个变量 currLen 表示当前不重复子串长度,maxLen表示截至目前最长的非重复子串长度。
func lengthOfLongestSubstring(s string) int {
if s == "" {
return 0;
}
var arr [256]int;
var maxLen = 1; //记录所有最大状态
var currLen = 0; //记录当前最大状态
var flag = 0;
for i, j := 0, 0; j < len(s); j++ {
arr[s[j]-'0']++; //先插入哈希表
if(arr[s[j]-'0'] > 1){
flag = 1;
maxLen = max(currLen, maxLen); //更新maxLen
currLen = 0;
for k := 0; k < 256; k++ { //再次初始化哈希表
arr[k] = 0;
}
i++;
j = i-1;
} else {
flag = 0;
currLen++;
}
}
if flag == 0 {
maxLen = max(currLen,maxLen);
}
return maxLen;
}
func max(a int, b int) int{
if a > b {
return a;
}
return b;
}