LC388.文件的最长路径
思路1:哈希表模拟
- 哈希表
<int, int> ump,key代表当前深度level,value从第0层到第level层深度的总长度。 - 每个文件一定是衔接最近的上级目录,所以当前层次文件或者目录长度
ump[level] = ump[level - 1] + cur_len。 - 如果是文件,那么就进行比较
max_len = max(max_len, ump[level] - 本质上是利用了哈希表的不重复性,可以保证上级目录长度一定是当前文件需要的那一个。
 如何去确定
level和当前文件长度cur_len,不复杂,但是容易乱。在数组里面跑来跑去是我的短板,这种题目需要多练习。代码1:
class Solution {public:int lengthLongestPath(string input) {// ump[i] = len 从第0层到第i层,累计的长度unordered_map<int, int> ump;vector<string> res;int max_len = 0;bool is_file = false;for (int i = 0, ns = input.size(); i < ns; ) {// 读掉前面的转义符int k = i;if (input[k] == '\n') {k++;}int level = 0;while (k < ns && input[k] == '\t') {k++;level += 1;}int cur_len = 0;int rec = k;// 读目录或者文件的长度class Solution {public:int lengthLongestPath(string input) {// ump[i] = len 从第0层到第i层,累计的长度unordered_map<int, int> ump;vector<string> res;int max_len = 0;bool is_file = false;for (int i = 0, ns = input.size(); i < ns; ) {// 读掉前面的转义符int k = i;if (input[k] == '\n') {k++;}int level = 0;while (k < ns && input[k] == '\t') {k++;level += 1;}int cur_len = 0;int rec = k;// 读目录或者文件的长度is_file = false;while (k < ns && input[k] != '\n') {k++;if (input[k] == '.') {is_file = true;}cur_len += 1;}ump[level] = ump[level - 1] + cur_len;// cout << level << " " << input.substr(rec, cur_len) << endl;if (is_file) {max_len = max(max_len, ump[level] + level);}i = k;}return is_file ? max_len : 0;}};is_file = false;while (k < ns && input[k] != '\n') {k++;if (input[k] == '.') {is_file = true;}cur_len += 1;}ump[level] = ump[level - 1] + cur_len;// cout << level << " " << input.substr(rec, cur_len) << endl;if (is_file) {max_len = max(max_len, ump[level] + level);}i = k;}return is_file ? max_len : 0;}};
思路2: 栈模拟
依然需要读取所有目录和文件的深度
level和当前长度cur_len如果当前入栈文件或目录深度
level大于栈顶level,那么直接入栈,否则,需要持续弹栈,直到level小于栈顶level代码2:
class Solution {public:int lengthLongestPath(string input) {int ns = input.size();stack<pair<int, int>> sta;int max_len = 0;bool is_file = false;for (int i = 0; i < ns;) {if (input[i] == '\n') {i++;}int level = 0;while (i < ns && input[i] == '\t') {i++;level += 1;}// 读取文件长度int begin_pos = i;int cur_len = 0;is_file = false;while (i < ns && input[i] != '\n') {if (input[i] == '.') {is_file = true;}i++;cur_len += 1;}while (!sta.empty() && level <= sta.top().first) {sta.pop();}if (sta.empty() || level > sta.top().first) {int prev_len = (sta.empty() ? 0: sta.top().second);sta.push({level, cur_len + prev_len});if (is_file) {max_len = max(max_len, cur_len + prev_len + level);}}}return (is_file ? max_len : 0);}};class Solution {public:int lengthLongestPath(string input) {int ns = input.size();stack<pair<int, int>> sta;int max_len = 0;bool is_file = false;for (int i = 0; i < ns;) {if (input[i] == '\n') {i++;}int level = 0;while (i < ns && input[i] == '\t') {i++;level += 1;}// 读取文件长度int begin_pos = i;int cur_len = 0;is_file = false;while (i < ns && input[i] != '\n') {if (input[i] == '.') {is_file = true;}i++;cur_len += 1;}while (!sta.empty() && level <= sta.top().first) {sta.pop();}if (sta.empty() || level > sta.top().first) {int prev_len = (sta.empty() ? 0: sta.top().second);sta.push({level, cur_len + prev_len});if (is_file) {max_len = max(max_len, cur_len + prev_len + level);}}}return (is_file ? max_len : 0);}};
