type pair struct { _1 int // level _2 int // length } func lengthLongestPath(input string) (max int) { st := make([]pair, 0) strs := strings.Split(input, "\n") cnt := 0 for i := range strs { pre, l := 0, len(st) if l == 0 { pre = -1 } else { pre = st[l-1]._1 } lvnlen, isFile := process(strs[i], pre) for l != 0 && st[l-1]._1+1 != lvnlen._1 { cnt -= st[l-1]._2 st = st[:l-1] l-- } st = append(st, lvnlen) cnt += lvnlen._2 if isFile && max < cnt { max = cnt } } return } func process(s string, pre int) (lvnlen pair, isFile bool) { tabs, spaces, l := 0, 0, 0 for _, r := range s { l++ switch r { case '\t': tabs++ case ' ': spaces++ case '.': isFile = true } } if tabs <= pre+1 && pre+1 <= tabs+spaces/4 { // 4 spaces can also be regarded as tabs >:-( lvnlen._1, lvnlen._2 = pre+1, l-tabs-(pre+1-tabs)*4 } else { lvnlen._1, lvnlen._2 = tabs, l-tabs } if !isFile { lvnlen._2++ } return }