本题源自leetcode 388
----------------------------------------------------
思路: 1 用一个dp数组记录每一层最大长度。然后遍历字符串,遇到 \t 表明层数, \n表示 新的一层。然后开始统计文件名长度。
代码:
int lengthLongestPath(string input) {
int n = input.size();
if(n == 0)
return 0;
int count = 0;
int level = 1;
int isFile = false;
int res = 0;
vector<int> dp(20,0); //记录当前目录层的最大长度
for(int i = 0; i < n; i++){
while(i < n && input[i] == '\t'){ //记录当前是第几层目录
level++;
i++;
}
while(i < n && input[i] != '\n'){ //统计文件名长度
if(input[i] == '.')
isFile = true;
count++;
i++;
}
if(isFile){ //是文件
res = max(res,dp[level-1]+count);
}else{
dp[level] = dp[level-1] + count + 1; //1 表示目录 /
}
//遍历一个层后需要重置
count = 0;
level = 1;
isFile = false;
}
return res;
}
代码2:
int lengthLongestPath(string input) {
int n = input.size();
if(n == 0)
return 0;
int res = 0;
int count = 0;
int depth = 0;
int isDir = 1;
vector<int> dp;
for(int i = 0; i <= n; i++){
switch(input[i]){
case '\0':
case '\n':{
if(!depth)
count += isDir;
else
count += dp[depth-1] + isDir;
if(dp.size() > depth)
dp[depth] = count;
else
dp.push_back(count);
if(!isDir)
res = max(res,count);
count = 0;
depth = 0;
isDir = 1;
break;
}
case '\t':
depth++;
break;
case '.':
isDir = 0;
default:
count++;
}
}
return res;
}