Inputs:
abbccc abcabcabcabccc qwertyytrewq aaabaaabccbcccbde abcde aaaa aabbOutputs:
bbccc bccc tyyt bccbcccb de aaaa aabb
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 | package main import ( "fmt" ) type Substring struct { begin int end int } func longestSubstring(str string) string { m := map [uint8]bool{} substrings := []Substring{} for i := 0; i < len(str); i++ { if _, ok := m[str[i]]; !ok { m[str[i]] = true } if len(m) == 3 { m = map [uint8]bool{} m[str[i-1]] = true m[str[i]] = true if len(substrings) == 0 { substrings = append(substrings, Substring{0, i - 1}) } else { begin := substrings[len(substrings)-1].end c := str[begin] for j := begin; str[j] == c && j != 0; j-- { begin-- } substrings = append(substrings, Substring{begin + 1, i - 1}) } } } if len(m) == 2 { if len(substrings) == 0 { substrings = append(substrings, Substring{0, len(str) - 1}) } else { begin := substrings[len(substrings)-1].end c := str[begin] for j := begin; str[j] == c && j != 0; j-- { begin-- } substrings = append(substrings, Substring{begin + 1, len(str) - 1}) } } else { return str } var longest string for _, v := range substrings { substring := str[v.begin : v.end+1] if len(longest) <= len(substring) { longest = substring } } return longest } func main() { fmt.Println(longestSubstring( "abbccc" )) fmt.Println(longestSubstring( "abcabcabcabccc" )) fmt.Println(longestSubstring( "qwertyytrewq" )) fmt.Println(longestSubstring( "aaabaaabccbcccbde" )) fmt.Println(longestSubstring( "abcde" )) fmt.Println(longestSubstring( "aaaa" )) fmt.Println(longestSubstring( "aabb" )) } |