我有一个只包含数字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
对于大小为1,000,000的字符串,我认为没有出现过的最小数字应该最多有6个数字。
我的方法是生成从0到999,999的所有数字,并将它们按顺序插入一个向量中。然后创建一个标记已经被看到过的字符串的映射表。接下来我遍历字符串,对于每个位置,获取以它为起点的所有子字符串(大小从1到6),并将所有这些子字符串在映射表中标记为true。最后,我逐个检查所有键,当我找到映射表中值为false的第一个键时,我打印它。
以下是一些代码片段:
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);
}
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;
}
}
}
int counter=0;
while(appeared[numbers[counter]])counter++;
cout<<numbers[counter]<<endl;
关于算法的第一部分,我会先生成一个向量,然后用它来处理100个字符串。我需要在不到4秒的时间内解析这100个字符串。
目前,这个算法对我来说太慢了。我应该优化代码,还是考虑采用不同的方法?