用栈保存每一层路径,遇到文件就比较当前路径长度和保存的最长路径长度。根据\t的个数判断路径层数,当前路径小于上一层路径就退一定次数的栈,使栈内路径和当前路径保持一致。
class Solution {
public:
int lengthLongestPath(string input) {
int ans = 0;
int maxlen = 0;
string tmp = "";
stack<string> path;
int nowfloor = 0;
int nextfloor = 0;
int flag = 0;
for(int i = 0; i < input.length(); i ++){
if(input[i] == '.')
flag = 1;
if(input[i] == '\n' || i == input.length() - 1){
if(i == input.length() - 1)
tmp += input[i];
path.push(tmp);
ans += (tmp.length() + 1);
if(ans > maxlen && flag){
maxlen = ans;
}
while(input[++ i] == '\t')
nextfloor ++;
if(nextfloor <= nowfloor){
int df = nowfloor - nextfloor + 1;
while(df --){
string tp = path.top();
path.pop();
ans -= (tp.length() + 1);
}
}
tmp = "";
nowfloor = nextfloor;
nextfloor = 0;
flag = 0;
}
tmp += input[i];
}
return maxlen - 1 >= 0 ? maxlen - 1 : 0;
}
};
用一个flag记录当前字符串是不是文件(有没有‘.’)
一开始遇到了个问题
if(ans > maxlen && flag){
flag = 0;
maxlen = ans;
}
把对flag的修改放到了能够比较这里,但实际上每换一次目录就要修改为0;
因为有可能某个文件导致flag改为了1但是长度比已经记录下的最大值小,所以flag就会一直保持1,然后遇到不是文件的目录也会计算长度。