每日一题(LeetCode)----栈和队列-- 简化路径
1.题目(71. 简化路径)
-
给你一个字符串
path
,表示指向某一文件或目录的 Unix 风格 绝对路径 (以'/'
开头),请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中,一个点(
.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//'
)都被视为单个斜杠'/'
。 对于此问题,任何其他格式的点(例如,'...'
)均被视为文件/目录名称。请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠
'/'
开头。 - 两个目录名之间必须只有一个斜杠
'/'
。 - 最后一个目录名(如果存在)不能 以
'/'
结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'
或'..'
)。
返回简化后得到的 规范路径 。
示例 1:
输入:path = "/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:path = "/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:
输入:path = "/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:path = "/a/./b/../../c/" 输出:"/c"
提示:
1 <= path.length <= 3000
path
由英文字母,数字,'.'
,'/'
或'_'
组成。path
是一个有效的 Unix 风格绝对路径。
- 始终以斜杠
2.解题思路
思路一:使用栈
1.创建一个栈
2.如果当前栈中有元素
1> 如果当前栈中没有元素,那么将当前遍历到的字符入栈
2>如果当前栈中有元素
1 如果当前遍历到的字符为’/',那么与栈顶元素进行比较
如果栈顶字符也是’/',那么当前遍历到的字符不入栈,继续遍历下一个字符
如果栈顶字符不是’/',那么将当前遍历到的字符入栈,继续遍历下一个字符
2 如果当前遍历到的字符不是’/‘也不是’.',那么将将当前遍历到的字符入栈,继续遍历下一个字符
3 如果当前遍历到的字符是’.‘,我们用一个循环来获取’.‘出现的次数,并在每一次循环中先将’.‘入栈,如果’.‘的下一个不是’/‘(注意这个条件是在字符串有效的范围内生效的)那么继续遍历下一个字符,如果是’/‘就看’.'出现的次数
如果’.‘出现的次数小于等于两次,我们看第一次出现’.‘时,前一个字符是不是’/',
如果不是,那么继续遍历下一个字符
如果是,就看’.'时出现一次还是两次 如果是一次,我们就将栈中元素进行弹出一次
如果是两次,我们就将栈顶弹出三次,然后用一个循环弹出栈顶元素,直到栈顶元素为’/'结束,继续遍历下一个字符(注意如果栈中只有一个元素了,那么不进行弹出操作)
3>创建一个栈,将当前栈中元素放入到新创建的这个栈中
4>创建一个字符串,将新创建的栈的元素一次放到字符串中(注意:当栈中元素不为1时,那我们要对最后一个元素进行一下处理,如果这个元素为’/',我们就不进行放入了)
3.写出代码
思路一的代码
class Solution {
public:string simplifyPath(string path) {int length = path.size();stack<char> sta;for (int i = 0; i < length;) {if (sta.empty()) {sta.push(path[i]);}else {if (path[i] == '/' && sta.top() == '/') {i++;continue;}else if (path[i] == '/' && sta.top() != '/') {sta.push(path[i]);i++;continue;}else if (path[i] != '.' && path[i] != '/') {sta.push(path[i]);i++;} else{int t = 0;while (path[i] == '.' && i < length) {sta.push(path[i]);i++;t++;}if (path[i] != '/'&&i<length) {continue;}if (t <= 2) {int temp = t;if (temp == 2) {if (path[i - 3] != '/') {continue;}temp++;while (temp != 0 && sta.size() > 1) {sta.pop();temp--;}while (sta.top() != '/' && sta.size() > 1) {sta.pop();}}if (temp == 1) {if (path[i - 2] != '/') {continue;}while (temp != 0) {sta.pop();temp--;}}}}}}string res = "";stack<char> sta2;if (sta.size() == 1) {res+= sta.top();return res;}while (!sta.empty()) {sta2.push(sta.top());sta.pop();}while (!sta2.empty()) {if (sta2.size() == 1 &&sta2.top() == '/') {break;}res += sta2.top();sta2.pop();}return res;}
};