原本想的方法:利用暴力模拟+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;
}

京公网安备 11010502036488号