-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
78 lines (72 loc) · 1.42 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Leetcode problem
//Given a string, find the longest substring without repeating characters.
//
//Example 1:
//
//Input: "abcabcbb"
//Output: 3
//Explanation: The answer is "abc", with the length of 3.
//Example 2:
//
//Input: "bbbbb"
//Output: 1
//Explanation: The answer is "b", with the length of 1.
//Example 3:
//
//Input: "pwwkew"
//Output: 3
//Explanation: The answer is "wke", with the length of 3.
//Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
package main
type test struct {
str1 string
exp string
}
var tests []test
func main() {
for _, t := range tests {
if longestSubstring(t.str1) != t.exp {
panic("Test failed:" + t.str1)
}
}
}
func longestSubstring(s string) string {
l := len(s)
sub := ""
subMax := ""
subS := 0
lSub, lMax := 0, 0
cMap := make(map[uint8]int, 0)
for i := 0; i < l; i++ {
ch := s[i]
if v, ok := cMap[ch]; ok {
if lSub > lMax {
lMax = lSub
subMax = sub
}
sub = s[v+1 : i+1]
lSub = len(sub)
cMap[ch] = i
for j := subS; j < v; j++ {
delete(cMap, s[j])
}
subS = v + 1
} else {
cMap[ch] = i
sub += string(ch)
lSub++
}
}
if lSub > lMax {
lMax = lSub
subMax = sub
}
return subMax
}
func init() {
tests = make([]test, 0)
tests = append(tests, test{" ", " "})
tests = append(tests, test{"abcabcbb", "abc"})
tests = append(tests, test{"bbbb", "b"})
tests = append(tests, test{"pwwkew", "wke"})
}