A. *_*ski 6 c++ string algorithm substring
我有一个只包含数字0-9的字符串.字符串的长度可以在1到1,000,000个字符之间.我需要在线性时间内找到字符串中不存在的最小数字.这里有些例子:
1023456789 //Smallest number not in string is 11
1023479 //Smallest number not in string is 5
112131405678910 //Smallest number not in string is 15
Run Code Online (Sandbox Code Playgroud)
大小为1,000,000,我认为字符串中不存在的最小数字必须至多为6位数.
我的方法是生成所有数字0到999,999并将它们全部插入到一个向量中(按顺序).然后制作一个标记已经看到的字符串的地图.然后我遍历字符串,对于每个位置,我得到从它开始的所有子字符串,大小为1到6,并且我在地图中将所有这些子字符串标记为true.最后,我只是逐个检查所有键,当我发现第一个在地图中有假值时,我打印出来.
以下是一些代码段:
string tmp="0";
string numbers[999999];
void increase(int pos)
{
if(pos==-1)tmp.insert(0,"1");
else if(tmp.at(pos)!='9')tmp.at(pos)++;
else
{
tmp.at(pos)='0';
increase(pos-1);
}
}
//And later inside main
for(int j=0;j<999999;j++)
{
numbers[j]=tmp;
increase(tmp.size()-1);
}
Run Code Online (Sandbox Code Playgroud)
for(int j=0;j<input.size();j++)
{
for(int k=0;k<6;k++)
{
string temp="";
if(j+k<input.size())
{
temp+=input.at(j+k);
appeared[temp]=true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
int counter=0;
while(appeared[numbers[counter]])counter++;
cout<<numbers[counter]<<endl;
Run Code Online (Sandbox Code Playgroud)
关于算法第一部分的说明.我生成一次矢量,然后我用它100个字符串.我需要在不到4秒的时间内解析所有100个字符串.
这个算法对我来说太慢了,因为它是目前的.我可以优化一些代码,还是应该考虑不同的方法?
由于您只需要知道某个数字是否已被看到,因此使用 astd::vector<bool>来存储该指示可能是最简单的。当您遍历输入数字时,您在数组中将数字标记为 true。完成后,您将遍历数组,并打印出第一个仍为 false 的项目的索引。