刘珈汝不要生气了!我错了
没有优化的情况,运行时间和空间比较大,但是代码应该是比较清楚易懂。
首先先要理解题意:
1.只有前边几个元素都相同的情况下才要折叠起来。
例如:
a\b\c
b\c
这个应该写成下边第一个,而不是第二个的形式
2.要按照字母顺序进行排列,这一点只要sort排序就好了。
理解了题意就可以想象这道题的解决方案:
1.先对所有的输入按照字母顺序进行排序(直接sort就可以)。
2.把形如“a\b\c”的字符串分割成[“a”,“b”,“c”]这样的字符串数组。
3.第一组直接输出就可以,后边的每一组要分别找到距离前一组的第一个不同元素。这儿不太好理解,我们举个例子:
所以通过以上三个顺序进行求解就可以了。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=11;
vector<string> vec[maxn];
int n;string s;
int main(){
while(cin>>n&&n!=0){
for(int i=0;i<n;i++){
cin>>s;
vec[i].clear();//清楚上一次的
vec[i].push_back(s);
}sort(vec,vec+n);
for(int i=0;i<n;i++){//截取 把形如“a\b\c”的字符串分割成[“a”,“b”,“c”]这样的字符串数组
s=vec[i][0];
vec[i].clear();
int j=0,index;
while(j<s.size()){
if((index=s.find('\\',j))!=string::npos){
vec[i].push_back(s.substr(j,index-j));//substr截取函数(从j位开始,截取index-j位)
j=index+1;
}else{
vec[i].push_back(s.substr(j,s.size()-j));break;
}
}
}for(int i=0;i<n;i++){//打印
if(i==0){//第一个直接输出
for(int j=0;j<vec[i].size();j++){
for(int k=0;k<j;k++)cout<<" ";
cout<<vec[i][j]<<endl;
}
}else{//找到和前一个第一个不相等的位置
int j=0;
while(j<vec[i-1].size()&&j<vec[i].size()&&vec[i][j]==vec[i-1][j])j++;
if(j==0){//如果第一个字母就不相同,直接输出
for(int k=0;k<vec[i].size();k++){
for(int l=0;l<k;l++)cout<<" ";
cout<<vec[i][k]<<endl;
}
}else{//找到了第一个不相同的位置j,从j开始输出
for(int k=j;k<vec[i].size();k++){
for(int l=0;l<k;l++)cout<<" ";
cout<<vec[i][k]<<endl;
}
}
}
}cout<<endl;
}
return 0;
}



京公网安备 11010502036488号