|
@@ -0,0 +1,55 @@
|
|
|
+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
|
|
|
+}
|
|
|
+
|