永发信息网

字符串搜索问题( 求算法或者描述)

答案:4  悬赏:70  手机版
解决时间 2021-07-16 06:57

给一个字符串S: "01234567891011121314151617181920212223…… " ,它是由所有自然数由小到大依次排列起来的。任意给一个字符串S1,容易知道它在字符串S中出现无穷多次。编程求出他第一次出现的位置。

比如:串"18”最先出现的位置是 26,串"34"最先出现的位置是3

最佳答案

用什么编~~c,c#,java,vb...???

全部回答

如果是指要通用任意字符串模式匹配算法,而且原字符串(长m)和模式字符串(长n)均已知,请参考kmp算法,可以在O(m + n)内解决问题。

如果是指要这个题的一个算法,对于无限长的S,我有这样的一个算法,时间复杂度最差约为 O(n^3),n为任意给出的串的长度 把任意给出的字符串叫做s1,根据题意,可以知道s1一定是某个k位数m和它相邻的数字产生的一个串(一定有多种可能的数字m),而且它第一次出现的位置一定是其中最小的m所产生的。 由此,我们可以得到如下算法: for(k = 1; k <= n; k++){ //枚举位数 for(m = s1中的第一个k位数; m的位置没有越过s1; m = 下一个k位数){ //枚举s1中所有可能的k位数,对应每个k值有n - k + 1种可能 if(m是合法的k位数){ s2 = 根据s1中m的位置和值产生的一个和s1相同长度的串 if(s1 == s2){ 成功匹配,得到m } } } } 之后,又知道1位数有10个,2位数有90,3位数有900个,4位数有9000个。。。。。我们就可以根据求得的k的值和m的值和位置在O(n)内求得结果。

又枚举k最多有n个,枚举可能的k位数最多有n - k + 1个,在m合法的情况下产生s2和判断s1==s2需要O(n),可得总的时间复杂度O(n^3)

程序代码如下:

#include <iostream.h> int length(char *s) { int i; for(i=0;s[i]!='\0';i++); return i; } int StringSearch(char *str,char *substr) { int i,j; int lenstr=length(str); int lensubstr=length(substr); for(i=0;i<lenstr-lensubstr;i++) { for(j=0;j<lensubstr&&str[i+j]==substr[j];j++); if(substr[j]=='\0')return i+j-lensubstr;

} return -1; } void main() { char s1[100]; char s2[100]; cout<<"string:";cin>>s1; cout<<"substring:";cin>>s2; int p= StringSearch(s1,s2);//找到的位置存到p变量中,若p=-1则表示没找到

if(p==-1)cout<<"没找到!"<<endl;

else { cout<<"注:起始位置是0."<<endl; cout<<"找到了,位置:"<<p<<endl; } }

程序运行结果:

string s = "012345678910

建议你查阅一下kmp算法 算法是通用的 和语言无关

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2010年世界杯都是哪些国家进了
南京有专业培养软件开发的学校吗?
QQ飞车是大黄蜂好还是AE86好啊?
求部三维动画的名字
国美5800ixm现在报价多少,是最新的。
WOW的FS如果想PK厉害的话该怎么加天赋?
qq宠物几级可以结婚生蛋
有一辈子不变的爱吗.?
什么样的路最窄?
想玩轩辕剑,随便哪一部,给个下载网站
人在不饥饿时也需要什么水??
最近脸部严重缺水干燥的要死怎么办啊???
东邪西毒南帝北丐中神通----这中神通 指
有什么歌可以表达暗恋的,并且可以在表白时唱
植物大战僵尸不能玩
推荐资讯
吉林市的嘉业景园在哪个区域
我可以--蔡旻佑,求伴奏!要求效率!直接可以
QQ问题图标怎么点亮
怎样写关于初二大气层的科学小论文
现在POLO汽车手自一体好多钱呢?
关于母亲的日记
已知平行四边形的对角线AC与BD相交于点O,给
“你们学校有校庆日吗?是的,有”的英文翻译
好听的现场舞曲
真三专属2.2b徐晃最佳玩法
初三英语选择题、耐心来
伊克萨斯110在什么情况下镜头自动收缩?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?