题目描述:
工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/usr/local/bin”,就需要此次创建“/usr”、“/usr/local”以及“/usr/local/bin”。好在,Linux下mkdir提供了强大的“-p”选项,只要一条命令“mkdir -p /usr/local/bin”就能自动创建需要的上级目录。 现在给你一些需要创建的文件夹目录,请你帮忙生成相应的“mkdir -p”命令。
输入描述:
输入包含多组数据。 每组数据第一行为一个正整数n(1≤n≤1024)。 紧接着n行,每行包含一个待创建的目录名,目录名仅由数字和字母组成,长度不超过200个字符。
输出描述:
对应每一组数据,输出相应的、按照字典顺序排序的“mkdir -p”命令。 每组数据之后输出一个空行作为分隔。
示例输入:
3 /a /a/b /a/b/c 3 /usr/local/bin /usr/bin /usr/local/share/bin
输出:
mkdir -p /a/b/c mkdir -p /usr/bin mkdir -p /usr/local/bin mkdir -p /usr/local/share/bin
由题目我们可以了解到:
- 输出的文件列表需要按照字典序排好序
- 对于输入的路径有三种情况不用输出:
- 当前路径与前一个接收到的路径相同,则不用再输出一次
- 若前一个接收到的路径是当前路径的子串,则不用再次输出
所以现在只要实现了判断前一个路径是否是当前路径的子串即可解决问题。具体代码如下:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<string> dirstr(n);//使用vector<string>类型来接收路径
vector<bool> flag(n,true);//设置标签,默认为true
for(int i=0;i<n;++i)
{
cin>>dirstr[i];//接收所有输入路径
}
sort(dirstr.begin(),dirstr.end());//按照字典序排序
for(int i=0;i<dirstr.size()-1;++i)
{
if(dirstr[i]==dirstr[i+1])
flag[i]=false;//当前路径与后一个路径相同则只需输出一次
//判断是否为子串,以下三个条件同时满足:
//1.当前路径长度小于后一个路径长度
//2.下一个路径字符串按照当前字符串路径截断返回的字符串与当前路径字符串相同
//3.下一个路径字符串与当前字符串相同的内容后一个字符为'/'
else if((dirstr[i].size()<dirstr[i+1].size())
&&(dirstr[i]==dirstr[i+1].substr(0,dirstr[i].size()))
&&(dirstr[i+1][dirstr[i].size()]=='/'))
flag[i]=false;
}
for(int i=0;i<dirstr.size();++i)
{
if(flag[i])
cout<<"mkdir -p "<<dirstr[i]<<endl;
}
cout<<endl;
}
return 0;
}
该博客主要介绍了如何在C++中处理路径问题,特别是判断一个路径是否为另一个路径的子路径。内容涉及字典序排序以及排除特定输出条件的实现代码。
5438

被折叠的 条评论
为什么被折叠?



