思路分析
本题主要是用到string中的各种函数来处理字符串。
find 查找
rfind 反向查找
erase 删除字符串
绝对路径:以 / 符号开头,表示从根目录开始构建的路径。
相对路径:不以 / 符号开头,表示从当前目录开始构建的路径
若输入的是相对路径,则存放路径的字符串前要加上当前路径。
若输入为空,则当前目录就是答案
正规化的几种情况:
(1)遇到多个‘/’,只保留一个。
(2)遇到 ‘/./’,可直接删去。
(3)遇到‘ /…/’, 表示上一级目录,若前面没有了,说明是根目录,直接删去;若前面还有,则需要把前面一个目录也删去。
(4)结尾有‘/’,若只有一个‘/’,是根目录,不删;否则,删去。
因为这题可能输入空字符串,所以要用getline().
AC代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int P;
string cur,str;//cur保存当前目录,s保存之后每个需要正规化的路径
cin>>P>>cur;
getchar();//防止读入换行符
while(P--)
{
getline(cin, str);
int i;
if (str[0]!='/') //相对路径
{
str=cur+"/"+str;
}
if(str.size()==0) //注意考虑输入为空的情况
{
str = cur;
}
//删除多余的"/"
while ((i=str.find("//"))!=-1)
{
int count = 2;
while (str[i+count]=='/')
{
count++;
}
str.erase(i,count-1);
}
//删除"/*/"
while ((i=str.find("/./"))!=-1)
{
str.erase(i+1,2);
}
//处理"/**/"
while ((i=str.find("/../"))!=-1)
{
if(i==0) str.erase(i+1,3);
else
{
//使用rfind向前查找
int j=str.rfind("/",i-1);
str.erase(j,i-j+ 3);
}
}
//删除末尾的"/"
if(str.size()>1&& str[str.size()-1]== '/') str.erase(str.size()-1);
cout<<str<<endl;
}
return 0;
}