例题描述
工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/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”
命令。
每组数据之后输出一个空行作为分隔。
示例1:
- 输入:
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>
#include <vector>
using namespace std;
int main(){
int num;
while(cin >> num){
vector<string> vs(num);
vector<bool> flag(num,true);
for(int i = 0;i < num;++i) cin >> vs[i];
sort(vs.begin(), vs.end()); //字典序排布
for(int i = 0;i < vs.size() - 1;++i){
//1、两串相同
if(vs[i] == vs[i+1]) flag[i] = false;
// 2、前串是后串的子串,而且后串后一位是 '/'
else if(
vs[i].size() < vs[i+1].size()\
&& vs[i] == vs[i+1].substr(0,vs[i].size())\
&& vs[i+1][vs[i].size()] == '/'
){
flag[i] = false;
}
}
for(int i = 0;i < vs.size();++i){
if(flag[i])
cout << "mkdir -p " << vs[i] << endl;
}
cout << endl;
}
return 0;
}
代码实现二
#include<iostream>
#include<string>
#include<vector>
#include<set>
using namespace std;
int main(){
int num;
string s, next, mkdir = "mkdir -p ";
while (cin >> num){
set<string> data;
for (int i = 0; i < num; i++){
cin >> s;
data.insert(s);
}
//for (set<string>::iterator it = data.begin(); it != data.end(); it++)
// cout << *it << endl;
set<string>::iterator it = data.begin();
s = *it;
set<string> res;
for (it++; it != data.end(); it++){
next = *it;
if (next.length() < s.size()){
res.insert(s);
s = next;
}
else{
string t;
for (int i = 0; i < s.size(); i++)
t += next[i];
if (t == s && next[s.size()] == '/')
s = next;
else{
res.insert(s);
s = next;
}
}
}
res.insert(s);
for (set<string>::iterator it = res.begin(); it != res.end(); it++)
cout << mkdir << *it << endl;
cout << endl;
}
return 0;
}
链接:https://www.nowcoder.com/questionTerminal/433c0c6a1e604a4795291d9cd7a60c7a