刘珈汝不要生气了!我错了
没有优化的情况,运行时间和空间比较大,但是代码应该是比较清楚易懂。
首先先要理解题意:
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; }