12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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
- }
|