代码显示std :: bad_alloc错误在删除push_back消失时不知道该怎么办。请帮忙做什么。只有当我输入一个巨大的字符串时才会发生这种情况,否则它会完全运行。有没有另一种有效的方法来找到所有可能的子串,排列lexicographicaly然后将它们重新组合成一个字符串????请帮助 thnx提前
#include <cmath>
#include <set>
#include <cstdio>
#include <vector>
#include <iostream>
#include<string>
#include <algorithm>
using namespace std;
bool sortByString(string &t1, string &t2)
{
return t1 < t2;
}
int main() {
string s,sub,i,c,q;
int T;
cin>>T;
while(T--){
cin >> s;
int length = s.length();
cin>>q;
vector<string> ss;
for (c = 0; c < length; c++)
{
for (i =length-c;i>=1; i--)
{
ss.push_back(s.substr(c,i));
}
}
s="";
set<string> se(ss.begin(),ss.end());
ss.assign(se.begin(),se.end());
vector<string>::iterator p;
for( p=ss.begin();p!=ss.end();++p)
s.append(*p);
cout<<s[q-1]<<endl;
}
return 0;
}
答案 0 :(得分:0)
如果您有一个N个字符的字符串,则有大约N ^ 2/2个子字符串,其中包含N ^ 3/6个字符。对于巨大的输入字符串,这可能很多。
最终你需要输出它们,所以减少内存占用的唯一方法是避免同时存储所有这些子串/字符。
一个明显的优化是仅存储(开始,结束)索引对而不是子串。当你需要比较或打印子串时,你可以用索引对和原始字符串制作它们,做任何事情,并丢弃它们。
这将帮助你摆脱多维数据集,但这对于真正庞大的字符串来说可能还不够。
另一个可以帮助你的观察是,在具有相同来源的子串中,较短的一个在词典上较小。你可以使用这个事实,例如减少生成最小但尚未使用的子字符串时的可能性。我不会在这里详细介绍,以免破坏乐趣,但你可以使用一个数组,其中第i个元素存储从i开始的最短子串的长度,但是还没有打印出来。