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