leetcode--71 简化路径

Description:

给定一个文档 (Unix-style) 的完全路径,请进行路径简化。

例如,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

边界情况:

  • 你是否考虑了 路径 = "/../" 的情况?
    在这种情况下,你需返回 "/" 。
  • 此外,路径中也可能包含多个斜杠 '/' ,如 "/home//foo/" 。
    在这种情况下,你可忽略多余的斜杠,返回 "/home/foo" 



看起来和Unix系统文件的路径(相对和绝对)有关。我对这方面不太懂,改了半天发现自己只能实现'/'语法的功能。。。无奈去查了一下相关答案关于点号'.'的说明:当标识文件名时,也用符号“."和".."。他们分别标识当前工作目录和父目录。如果当前工作目录是根目录“."和".."就是一致的.


思路:这个方法巧妙的将传统上考虑到的仅声明一个string类型的返回值,变化为还包含一个存储字符串类型的数组,这样我们很容易就能对一一提取出来并做相关处理(厉害啊!!)。另外这里的 "." 就是直接直接去掉, ".."代表删掉它上面挨着的一个路径。另外要注意当v为空时返回"/"(但OJ上给出的此时的答案是"",但运行时却可以AC,可能是bug),代码如下:

//简化路径
//将路径看成一个由多个字符串(代表文件名)组成的序列,故利用数组来存储返回结果
class Solution {
public:
	string simplifyPath(string path) {
		vector<string>v;
		int i = 0;
		
		while (i < path.size()) {
			//忽略掉'/'
			while (path[i] == '/' && i < path.size())
				++i;
			if (i == path.size())
				break;
			//此时遇到的字符一定不为'/'
			int start = i;
			while (path[i] != '/' && i < path.size())
				++i;
			int end = i - 1;
			//代表文件名(也可能为'.'或'..')
			string s = path.substr(start, end - start + 1);
			if (s == "..") {
				if (!v.empty())
					v.pop_back();
			}
			else if (s != ".")
				v.push_back(s);
			//注:以上仅讨论当s为文件夹名和".."的情况,即忽略了".",因为它的作用是直接删去,正好符合要求
		}

		if (v.empty())
			return "/";
		string res;
		for (int i = 0; i < v.size(); ++i) {
			res += '/' + v[i];
		}
		return res;
	}
};

参考资料:http://www.cnblogs.com/grandyang/p/4347125.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值