用栈来模拟文件的搜索过程,栈内存放的是当前已经搜索到的文件路径长度和 采用双指针算法,每次操作一个文件或目录
class Solution {
public:
bool isFile(const string &s){
for(auto it:s){
if(it=='.') return 1;
}
return 0;
}
int lengthLongestPath(string input) {
int len=0,ans=0;
stack<int> s;
for(int i=0;i<input.length();){
int j=i,tt=0; //tt记录 \t出现次数
while(j<input.length()&&input[j]!='\n'){
tt+=(input[j]=='\t');
j++;
}
while(tt<s.size()){
len-=s.top();
s.pop();
}
s.push(j-i-tt);
len+=j-i-tt;
if(isFile(input.substr(i,j-i)))
ans=max(ans,len+(int)s.size()-1);
i=j+1;
}
return ans;
}
};
class Solution {
boolean isFile(String s){
return s.contains(".");
}
public int lengthLongestPath(String s) {
int ans=0,len=0;
Stack<Integer> stack=new Stack<>();
String[] strs=s.split("\n");
for(int i=0;i<strs.length;i++){
int j=0;
while(j<strs[i].length()&&strs[i].charAt(j)=='\t') j++;
while(stack.size()!=0&&j<stack.size()) {
len-=stack.peek();
stack.pop();
}
len+=strs[i].length()-j;
stack.push(strs[i].length()-j);
if(isFile(strs[i])){
ans=Math.max(ans,len+stack.size()-1);
}
}
return ans;
}
}