第三天(hhh,好像又很久没刷了), 又AC掉了逻辑题,或者说又是一道用if else
加状态机搞定的题。
今天的题目是71. Simplify Path
以后还是不copy
题目到这里来了,有点麻烦的感觉。。。
对于这种纯看逻辑的题目,可以先分析一下给出的测例,然后通过题目来分析要注意什么:
- “/home/”
- ”/../”
- “/home//foo/”
- “/a/./b/../../c/”
- “/a/../../b/../c//.//”
- “/a//b////c/d//././/..”
从上面我们大概可以知道要注意的一些点有:
- 首先疑似最开始的符号一定是’/’?
- 通过
/
来分割单词,这意味着我们可以用python
中的split
或者先做一次遍历来分割单词,这样做会简化逻辑(但我没用这种方法)
- 要区分
.
和..
.
表示当前目录,..
表示上级目录
- 遇到多个
/
,就当成一个
事实上在后面的测试中,我发现一个很坑的点,就是...
和..a
这种并不是一个特殊的字符串,可以作为路径名。
我们现在尝试写一个基于状态机的方法,首先定义一下遍历时需要的状态:
- 前面是一个正常的字符
- 遇到
/
,就插入到结果字符串中,并跳转到1
。
- 遇到
.
,就跳转到2
。
- 遇到一个正常的字符,插入到结果字符串中。
- 前面是
/
- 如果遇到一个
/
,就直接跳过
- 如果遇到一个
.
,跳转到2
- 如果是一个正常字符,就插入到结果字符串中并跳转到
0
- 前面是
.
- 如果遇到一个
/
, 就跳转到1
- 如果遇到一个
.
,就跳转到3
- 如果遇到一个正常字符,就插入
.
和这个字符,并跳转到0
- 前面是
..
- 如果遇到一个
/
,就开始回溯删除到前面一个/
- 其余则插入一个
..
和这个字符,并跳转到0
update at 2020-03-23
状态转移图:
这道题其实用栈会更简单一点:
用stringstream
和getline
来进行字符串分割: