LC388.文件的最长路径

原题链接
image.png

思路1:哈希表模拟

  • 哈希表<int, int> umpkey代表当前深度levelvalue从第0层到第level层深度的总长度。
  • 每个文件一定是衔接最近的上级目录,所以当前层次文件或者目录长度ump[level] = ump[level - 1] + cur_len
  • 如果是文件,那么就进行比较max_len = max(max_len, ump[level]
  • 本质上是利用了哈希表的不重复性,可以保证上级目录长度一定是当前文件需要的那一个。
  • 如何去确定level和当前文件长度cur_len,不复杂,但是容易乱。在数组里面跑来跑去是我的短板,这种题目需要多练习。

    代码1:

    1. class Solution {
    2. public:
    3. int lengthLongestPath(string input) {
    4. // ump[i] = len 从第0层到第i层,累计的长度
    5. unordered_map<int, int> ump;
    6. vector<string> res;
    7. int max_len = 0;
    8. bool is_file = false;
    9. for (int i = 0, ns = input.size(); i < ns; ) {
    10. // 读掉前面的转义符
    11. int k = i;
    12. if (input[k] == '\n') {
    13. k++;
    14. }
    15. int level = 0;
    16. while (k < ns && input[k] == '\t') {
    17. k++;
    18. level += 1;
    19. }
    20. int cur_len = 0;
    21. int rec = k;
    22. // 读目录或者文件的长度class Solution {
    23. public:
    24. int lengthLongestPath(string input) {
    25. // ump[i] = len 从第0层到第i层,累计的长度
    26. unordered_map<int, int> ump;
    27. vector<string> res;
    28. int max_len = 0;
    29. bool is_file = false;
    30. for (int i = 0, ns = input.size(); i < ns; ) {
    31. // 读掉前面的转义符
    32. int k = i;
    33. if (input[k] == '\n') {
    34. k++;
    35. }
    36. int level = 0;
    37. while (k < ns && input[k] == '\t') {
    38. k++;
    39. level += 1;
    40. }
    41. int cur_len = 0;
    42. int rec = k;
    43. // 读目录或者文件的长度
    44. is_file = false;
    45. while (k < ns && input[k] != '\n') {
    46. k++;
    47. if (input[k] == '.') {
    48. is_file = true;
    49. }
    50. cur_len += 1;
    51. }
    52. ump[level] = ump[level - 1] + cur_len;
    53. // cout << level << " " << input.substr(rec, cur_len) << endl;
    54. if (is_file) {
    55. max_len = max(max_len, ump[level] + level);
    56. }
    57. i = k;
    58. }
    59. return is_file ? max_len : 0;
    60. }
    61. };
    62. is_file = false;
    63. while (k < ns && input[k] != '\n') {
    64. k++;
    65. if (input[k] == '.') {
    66. is_file = true;
    67. }
    68. cur_len += 1;
    69. }
    70. ump[level] = ump[level - 1] + cur_len;
    71. // cout << level << " " << input.substr(rec, cur_len) << endl;
    72. if (is_file) {
    73. max_len = max(max_len, ump[level] + level);
    74. }
    75. i = k;
    76. }
    77. return is_file ? max_len : 0;
    78. }
    79. };

    思路2: 栈模拟

  • 依然需要读取所有目录和文件的深度level和当前长度cur_len

  • 如果当前入栈文件或目录深度level大于栈顶level,那么直接入栈,否则,需要持续弹栈,直到level小于栈顶level

    代码2:

    1. class Solution {
    2. public:
    3. int lengthLongestPath(string input) {
    4. int ns = input.size();
    5. stack<pair<int, int>> sta;
    6. int max_len = 0;
    7. bool is_file = false;
    8. for (int i = 0; i < ns;) {
    9. if (input[i] == '\n') {
    10. i++;
    11. }
    12. int level = 0;
    13. while (i < ns && input[i] == '\t') {
    14. i++;
    15. level += 1;
    16. }
    17. // 读取文件长度
    18. int begin_pos = i;
    19. int cur_len = 0;
    20. is_file = false;
    21. while (i < ns && input[i] != '\n') {
    22. if (input[i] == '.') {
    23. is_file = true;
    24. }
    25. i++;
    26. cur_len += 1;
    27. }
    28. while (!sta.empty() && level <= sta.top().first) {
    29. sta.pop();
    30. }
    31. if (sta.empty() || level > sta.top().first) {
    32. int prev_len = (sta.empty() ? 0: sta.top().second);
    33. sta.push({level, cur_len + prev_len});
    34. if (is_file) {
    35. max_len = max(max_len, cur_len + prev_len + level);
    36. }
    37. }
    38. }
    39. return (is_file ? max_len : 0);
    40. }
    41. };class Solution {
    42. public:
    43. int lengthLongestPath(string input) {
    44. int ns = input.size();
    45. stack<pair<int, int>> sta;
    46. int max_len = 0;
    47. bool is_file = false;
    48. for (int i = 0; i < ns;) {
    49. if (input[i] == '\n') {
    50. i++;
    51. }
    52. int level = 0;
    53. while (i < ns && input[i] == '\t') {
    54. i++;
    55. level += 1;
    56. }
    57. // 读取文件长度
    58. int begin_pos = i;
    59. int cur_len = 0;
    60. is_file = false;
    61. while (i < ns && input[i] != '\n') {
    62. if (input[i] == '.') {
    63. is_file = true;
    64. }
    65. i++;
    66. cur_len += 1;
    67. }
    68. while (!sta.empty() && level <= sta.top().first) {
    69. sta.pop();
    70. }
    71. if (sta.empty() || level > sta.top().first) {
    72. int prev_len = (sta.empty() ? 0: sta.top().second);
    73. sta.push({level, cur_len + prev_len});
    74. if (is_file) {
    75. max_len = max(max_len, cur_len + prev_len + level);
    76. }
    77. }
    78. }
    79. return (is_file ? max_len : 0);
    80. }
    81. };