原本想的方法:利用暴力模拟+map记录
所有可能子串相当于满二叉树的路径序列,用遍历二叉树的方式不断拼接字符串构造可能的序列 。层序比较简单,但题目要求按DFS的顺序
所有可能子串相当于满二叉树的路径序列,用遍历二叉树的方式不断拼接字符串构造可能的序列 。层序比较简单,但题目要求按DFS的顺序
最后发现答案正确,但超出空间限制了
仔细想想没必要,只在输入字符串的序列中找可能序列即可
仔细想想没必要,只在输入字符串的序列中找可能序列即可
看了标准答案,发现这个方法还是有点弱智
substr既然已经得到子串序列了,直接用map统计就完了,干嘛还要find啊....
#include<string> #include<set> #include<iostream> using namespace std; int main(){//例题10.9 北京大学 子串计算 //逐个输入处理 string seq; while(cin>>seq){ int n = seq.size(); set<string> table; //构造可能序列 for(int len=1;len<=n;len++){//长度为1、2、3...的序列 for(int start=0;start<=n-len;start++){//从0、1、2...开始的序列 table.insert(seq.substr(start,len)); } } //判断可能序列 set<string>::iterator it; for(it = table.begin();it!=table.end();it++){ if(it->size()>n) continue; int start = 0; int counter = 0; while(start<n){ start = seq.find(*it,start); if(start==string::npos){ break; } else { counter++; start++; } } if(counter>1)cout<<*it<<" "<<counter<<endl; } } return 0; }