1.388. 文件的最长绝对路径 - 力扣(LeetCode)
其实看懂了就还好
用一个栈来保存所遍历过最大的文件的绝对路径的长度,栈顶元素是文件的长度,栈中元素的个数是该文件目录的深度,非栈顶元素就是当时目录的长度
检查此时所所遍历的目录的深度,看有多少个 "\t",因为根目录是第一级,所以深度从1开始计算而不是从0开始计算
再来判断文件的长度,遇到 “\n”,就代表文件遍历完了,要换一层目录,遇到pos > n说明遍历完辣
然后检查一下之前有没有遍历过深度更大的文件,写的时候这里半天没搞懂,报一丝
具体用 st.size() 与 depth 之间的大小关系判断,如果st.size() >= depth 说明曾经遍历过深度更大的文件。
等一下,我又发现我理解错了,这个栈的作用不是我所理解的保存文件绝对路径的长度,他是用来帮助计算此时所遍历到的文件的长度,然后每次更新ans值记录最大的长度。
怎么正确计算呢,话接上文,曾经遍历过深度更大的目录或文件,说明此时所遍历的文件或者是此时所在的目录发生了路径跳转,不是那个深度更大的目录或是文件了,栈中包含的不必要的更深层的长度信息,但是我们要计算的是此时所在文件或是目录的路径长度。所以就回退,回退到上一级目录,也是它俩的共同父亲目录,去计算长度信息。
class Solution {
public:
int lengthLongestPath(string input) {
int n = input.size();
int pos = 0, ans = 0;
stack<int> st;
while(pos < n){
// 统计当前文件深度
int depth = 1;
while(pos < n && input[pos] == '\t'){
depth++, pos++;
}
//统计文件夹的长度
int len = 0;
bool flag = false;
while(pos < n && input[pos] != '\n'){
if(input[pos] == '.'){
flag = true;
}
pos++, len++;
}
//跳过换行符
pos++;
//计算长度
if(st.size() >= depth){
st.pop();
}
//加上前面的目录路径
if(!st.empty()){
len += st.top() + 1;
}
if(flag)
ans = max(ans, len);
st.emplace(len);
}
return ans;
}
};
2.394. 字符串解码 - 力扣(LeetCode)
class Solution {
public:
//遇到数字,将整个数字提取出来
string getDigits(string &s, size_t &ptr){
string res = "";
while(isdigit(s[ptr])){
res.push_back(s[ptr++]);
}
return res;
}
//把字符串容器里的元素 变成字符串
string getString(vector<string> &s){
string res;
for(const auto &v : s){
res += v;
}
return res;
}
string decodeString(string s) {
vector<string> stk;
size_t ptr = 0;
while(ptr < s.size()){
char cur = s[ptr];
// 如果当前字符cur是数字 提取出来 入栈
if(isdigit(cur)){
string num = getDigits(s, ptr);
stk.push_back(num);
}
// 如果当前字符cur是字母或者是左括号 入栈
else if(isalpha(cur) || cur == '['){
stk.push_back(string(1, s[ptr++]));
}
else{
// 当前字符是右括号
++ptr;
vector<string> sub;
// 将栈中的字符都提取出来
while(stk.back() != "["){
sub.push_back(stk.back());
stk.pop_back();
}
// 栈先进后出 所以需要翻一下
reverse(sub.begin(), sub.end());
// 弹出左括号
stk.pop_back();
// 看字符串相印要重复多少次
int count = stoi(stk.back());
// 弹出数字
stk.pop_back();
string t, o = getString(sub);
while(count--) t += o;
// 将所得字符串入栈 与下一次循环一起
stk.push_back(t);
}
}
return getString(stk);
}
};