388.longest-absolute-file-path.go 973 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. type pair struct {
  2. _1 int // level
  3. _2 int // length
  4. }
  5. func lengthLongestPath(input string) (max int) {
  6. st := make([]pair, 0)
  7. strs := strings.Split(input, "\n")
  8. cnt := 0
  9. for i := range strs {
  10. pre, l := 0, len(st)
  11. if l == 0 {
  12. pre = -1
  13. } else {
  14. pre = st[l-1]._1
  15. }
  16. lvnlen, isFile := process(strs[i], pre)
  17. for l != 0 && st[l-1]._1+1 != lvnlen._1 {
  18. cnt -= st[l-1]._2
  19. st = st[:l-1]
  20. l--
  21. }
  22. st = append(st, lvnlen)
  23. cnt += lvnlen._2
  24. if isFile && max < cnt {
  25. max = cnt
  26. }
  27. }
  28. return
  29. }
  30. func process(s string, pre int) (lvnlen pair, isFile bool) {
  31. tabs, spaces, l := 0, 0, 0
  32. for _, r := range s {
  33. l++
  34. switch r {
  35. case '\t':
  36. tabs++
  37. case ' ':
  38. spaces++
  39. case '.':
  40. isFile = true
  41. }
  42. }
  43. if tabs <= pre+1 && pre+1 <= tabs+spaces/4 { // 4 spaces can also be regarded as tabs >:-(
  44. lvnlen._1, lvnlen._2 = pre+1, l-tabs-(pre+1-tabs)*4
  45. } else {
  46. lvnlen._1, lvnlen._2 = tabs, l-tabs
  47. }
  48. if !isFile {
  49. lvnlen._2++
  50. }
  51. return
  52. }