package main // Return the longest substring of an input string without repeated // characters. See longunstr.py for more context. import ( "fmt" "os" ) func Longunstr(s string) string { r := []rune(s) var i, n, m int p := make(map[rune]int) for j, c := range r { q, ok := p[c] if ok && q >= i { // advance past last match i = q + 1 } p[c] = j // longer? if j+1 - i > m - n { n = i m = j+1 } } return string(r[n:m]) } // Same result, but easier to explain, and much slower func Longunstr_basic(s string) string { r := ([]rune)(s) var n, m int for i := range r { seen := make(map[rune]bool) for j := i; j < len(r); j++ { jc := r[j] if seen[jc] { break } seen[jc] = true if j+1 - i > m - n { n = i m = j + 1 } } } return (string)(r[n:m]) } func main() { fmt.Println(Longunstr_basic(os.Args[1]), Longunstr(os.Args[1])) }