LeetCode(71):简化路径

摘要:
例如,path="/home/",=˃"/home"path="/a/./b/../../c/",=˃"/c"边界情况:你是否考虑了路径="/../"的情况?那么我们可以把路径看做是由一个或多个"/"分割开的众多子字符串,把它们分别提取出来一一处理即可。="."){16v.push_back;17}18}19ifreturn"/";20stringres;21for{22res+='/'+v[i];23}24returnres;25}26};还有一种解法是利用了C语言中的函数strtok来分隔字符串,但是需要把string和char*类型相互转换,转换方法请戳http://www.cnblogs.com/grandyang/p/4312273.html。="."){13v.push_back;14}15pch=strtok;16}17ifreturn"/";18stringres;19for{20res+='/'+v[i];21}22returnres;23}24};C++中也有专门处理字符串的机制,我们可以使用stringstream来分隔字符串,然后对每一段分别处理,思路和上面的方法相似。

Medium!

题目描述:

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

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

边界情况:

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

解题思路:

这道题让简化给定的路径,光是根据题目中给的那一个例子还真不太好总结出规律,应该再加上两个例子path="/a/./b/../c/", =>"/a/c"和path="/a/./b/c/", =>"/a/b/c",这样我们就可以知道中间是"."的情况直接去掉,是".."时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回"/",如果有多个"/"只保留一个。那么我们可以把路径看做是由一个或多个"/"分割开的众多子字符串,把它们分别提取出来一一处理即可。

C++解法一:

1 classSolution {
2 public:
3     string simplifyPath(stringpath) {
4         vector<string>v;
5         int i = 0;
6         while (i <path.size()) {
7             while (path[i] == '/' && i < path.size()) ++i;
8             if (i == path.size()) break;
9             int start =i;
10             while (path[i] != '/' && i < path.size()) ++i;
11             int end = i - 1;
12             string s = path.substr(start, end - start + 1);
13             if (s == "..") {
14                 if (!v.empty()) v.pop_back(); 
15             } else if (s != ".") {
16 v.push_back(s);
17 }
18 }
19         if (v.empty()) return "/";
20         stringres;
21         for (int i = 0; i < v.size(); ++i) {
22             res += '/' +v[i];
23 }
24         returnres;
25 }
26 };

还有一种解法是利用了C语言中的函数strtok来分隔字符串,但是需要把string和char*类型相互转换,转换方法请戳http://www.cnblogs.com/grandyang/p/4312273.html。除了这块不同,其余的思想和上面那种解法相同。

C 解法一:

1 classSolution {
2 public:
3     string simplifyPath(stringpath) {
4         vector<string>v;
5         char *cstr = new char[path.length() + 1];
6 strcpy(cstr, path.c_str());
7         char *pch = strtok(cstr, "/");
8         while (pch !=NULL) {
9             string p = string(pch);
10             if (p == "..") {
11                 if (!v.empty()) v.pop_back();
12             } else if (p != ".") {
13 v.push_back(p);
14 }
15             pch = strtok(NULL, "/");
16 }
17         if (v.empty()) return "/";
18         stringres;
19         for (int i = 0; i < v.size(); ++i) {
20             res += '/' +v[i];
21 }
22         returnres;
23 }
24 };

C++中也有专门处理字符串的机制,我们可以使用stringstream来分隔字符串,然后对每一段分别处理,思路和上面的方法相似。

C++ 解法二:

1 classSolution {
2 public:
3     string simplifyPath(stringpath) {
4         stringres, t;
5 stringstream ss(path);
6         vector<string>v;
7         while (getline(ss, t, '/')) {
8             if (t == "" || t == ".") continue;
9             if (t == ".." && !v.empty()) v.pop_back();
10             else if (t != "..") v.push_back(t);
11 }
12         for (string s : v) res += "/" +s;
13         return res.empty() ? "/": res;
14 }
15 };

免责声明:文章转载自《LeetCode(71):简化路径》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库系统中文件附件保存的最佳办法centos7.9环境下编译安装zabbix5.0.9版本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

springBoot--Redis配置与使用

SpringBoot自动配置redis,主要是两个自动配置类 缓存管理器配置类:org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration redis封装了工具RedisTemplate自动配置:org.springframework.boot.autoconfigure.da...

C#微信公众平台开发者模式开启代码

using System;using System.IO;using System.Text;using System.Web.Security; namespace HPZJ.Web.sys.excel{    public partial class hpd_api_weixin : System.Web.UI.Page    {        con...

org.apache.commons.httpclient工具类(封装的HttpUtil)

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOEx...

WPF开发进阶

前一篇 简单的介绍了Fody/PropertyChanged的使用方法, 这一篇,我们详细介绍它的一些比较重要的特性和规则 1. Attributes 通过在类或属性上标记这些特性,可以在编译代码时,注入特定的功能 ImplementPropertyChangedAttribute 为类标记此特性,可以实现INotifyPropertyChanged接口...

模板jinja2常用方法

数学运算       +, -, *, /, **, //, %等数学运算符都支持. 逻辑运算       and, or, not也同样支持 1.   in 判断元素是否在集合中 2.   | 管道操作符, 默认使用Apply调用一个方法 3.   ~  字符串连接 4    ()  调用可调用对象 5.   . 和 [ ]获取属性 6.   三元操作:...

java 添加properties文件读写

import java.io.InputStream; import java.util.Properties; /** * @author guoxiang * */ public class Config { private static Config instance = null; private Propert...