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