runnig

Longest Substring Without Repeating Characters

Oct 26th, 2019
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.29 KB | None | 0 0
  1.  
  2. // Range ...
  3. type Range struct {
  4.     begin, end int
  5. }
  6.  
  7. // Fragment ...
  8. type Fragment struct {
  9.     substr  []rune
  10.     rng     Range
  11.     charset map[rune]bool
  12. }
  13.  
  14. // Len ...
  15. func (f *Fragment) Len() int {
  16.     return f.rng.end - f.rng.begin
  17. }
  18.  
  19. func toString(m map[rune]bool) string {
  20.     ret := []rune{}
  21.     for r := range m {
  22.         ret = append(ret, r)
  23.     }
  24.     return string(ret)
  25. }
  26.  
  27. // SoFar ...
  28. type SoFar struct {
  29.     fragments      []*Fragment
  30.     maxFragmentLen int
  31. }
  32.  
  33. func (sf *SoFar) condAdd(f *Fragment) {
  34.     if f.Len() <= sf.maxFragmentLen {
  35.         return
  36.     }
  37.     sf.fragments = append(sf.fragments, f)
  38.     sf.maxFragmentLen = f.Len()
  39. }
  40.  
  41. func (sf *SoFar) uncondAdd(f *Fragment) {
  42.     sf.fragments = append(sf.fragments, f)
  43.     if f.Len() >= sf.maxFragmentLen {
  44.         sf.maxFragmentLen = f.Len()
  45.     }
  46. }
  47.  
  48. func toChars(s string) []rune {
  49.     ret := []rune{}
  50.     for _, ch := range s {
  51.         ret = append(ret, ch)
  52.     }
  53.     return ret
  54. }
  55.  
  56. func solveImpl(offset int, chars []rune) SoFar {
  57.     output := SoFar{}
  58.     if offset == len(chars) {
  59.         return output
  60.     }
  61.     ch := chars[offset]
  62.     output.uncondAdd(&Fragment{
  63.         substr:  []rune{ch},
  64.         rng:     Range{begin: offset, end: offset + 1},
  65.         charset: map[rune]bool{ch: true},
  66.     })
  67.     soFar := solveImpl(offset+1, chars)
  68.  
  69.     for _, fragm := range soFar.fragments {
  70.         // check if there's a gap between the current rune ch and the fragm
  71.         if fragm.rng.begin-offset > 1 {
  72.             output.condAdd(fragm)
  73.             continue
  74.         }
  75.  
  76.         // if current char exists in the fragment
  77.         if fragm.charset[ch] {
  78.             output.condAdd(fragm)
  79.             continue
  80.         }
  81.         head := []rune{ch}
  82.         fragm.charset[ch] = true
  83.         output.uncondAdd(&Fragment{
  84.             substr:  append(head, fragm.substr...),
  85.             rng:     Range{begin: offset, end: fragm.rng.end},
  86.             charset: fragm.charset,
  87.         })
  88.     }
  89.  
  90.     maxFragmLen := 0
  91.     for _, f := range output.fragments {
  92.         if f.Len() >= maxFragmLen {
  93.             maxFragmLen = f.Len()
  94.         }
  95.     }
  96.     output.maxFragmentLen = maxFragmLen
  97.  
  98.     return output
  99. }
  100.  
  101. func solve(s string) int {
  102.     chars := toChars(s)
  103.     soFar := solveImpl(0, chars)
  104.     if len(soFar.fragments) < 1 {
  105.         return 0
  106.     }
  107.     m := 0
  108.     maxFragmentIdx := 0
  109.     for i, f := range soFar.fragments {
  110.         if f.Len() > m {
  111.             maxFragmentIdx = i
  112.         }
  113.     }
  114.     return soFar.fragments[maxFragmentIdx].Len()
  115. }
  116.  
  117. func lengthOfLongestSubstring(s string) int {
  118.     return solve(s)
  119. }
Advertisement
Add Comment
Please, Sign In to add comment