初学C,请教一个算法的实现!

didazy 2005-07-12 12:33:45
/*从键盘输入字符串s1="abcdabcdef"和字符串s2="cde"
编写函数,运用指针,若字符串s2是字符串s1的子串
找到字符串s2在字符串s1中的起始位置,否则给出提示信息*/
...全文
413 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
arrowcy 2005-07-12
  • 打赏
  • 举报
回复
大致就是这样,细节问题你自己在调试调试吧
这么晚了,我也要睡了Zzz...
arrowcy 2005-07-12
  • 打赏
  • 举报
回复
这个有两种不同效率的实现方法,我就写一个效率低点的吧
int pos(char *source, char *template)
{
char *t=template;
int i, match, n;
n=0;
while(*source!='\0')
{
n++;
if(*source!=*template)//如果第一个字符不同,就继续扫描原串的下一个字符
source++;
else//如果相同,就比较两个串
{
match=1;
for (i=0; i<strlen(template); i++)
{
if (template[i]!=source[i])
{
match=0;
break;
}
}
if(match==1)
return n;
}
}
}
didazy 2005-07-12
  • 打赏
  • 举报
回复
呵呵,谢谢各位了.接着打基础!!
51365133 2005-07-12
  • 打赏
  • 举报
回复
int instr (const char * src,const char * dst)
{
int ret = 0 ;

const char *eos = dst;
const char *sos = src;

while(*src)
{
while(*dst && !(*(unsigned char *)src - *(unsigned char *)dst))
{
++src;
++dst;
}

if(!*dst)
{
ret=(src-sos)-(dst-eos);
return ret;
}

src=src-dst+eos+1;
dst=eos;
}
return 0;
}
上边我写的有点罗嗦了,用这个吧。
EagleMember 2005-07-12
  • 打赏
  • 举报
回复
各位讨论的正热闹呀,查找子串的算可以说是最基本的了呀,楼上几位都写的很好呀。
51365133 2005-07-12
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int instr (const char * src,const char * dst);

int main()
{
int ret=instr("abcdabglcdefuuu","cdef");
printf("%d",ret);
system("pause");
return 0;
}

int instr (const char * src,const char * dst)
{
int ret = 0 ;

const char *eos = dst;
const char *sos = src;

while(*src && !ret)
{
if((*(unsigned char *)src - *(unsigned char *)dst))
{
++src;
}
else
{
while(*dst && !(*(unsigned char *)src - *(unsigned char *)dst))
{
++src;
++dst;
}
if(!*dst)
{
ret=(src-sos)-(dst-eos);
}
else
{
src=src-dst+eos+1;
dst=eos;
}
}
}
return ret;
}
masui 2005-07-12
  • 打赏
  • 举报
回复
//求给定的两个字符串的最大公共子串你改一下就可以了。
#include<iostream>
#include<string>
using namespace std;
const int n=100;
int c[n][n];
char str[n];
int lcs_len(string a,string b,int c[][n])
{
int sa=a.length();
int sb=b.length();
int i,j;
for(i=0;i<=sa;++i)c[i][0]=0;
for(j=0;j<=sb;++j)c[0][j]=0;
for(i=1;i<=sa;++i)
{
for(j=1;j<=sb;++j)
{
if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;
else if(c[i][j-1]>c[i-1][j])c[i][j]=c[i][j-1];
else c[i][j]=c[i-1][j];
}
}
return c[sa][sb];
}
char*bulid_lcs(char str[],string a,string b)
{
int k,i=a.length(),j=b.length();
k=lcs_len(a,b,c);
str[k]='\0';
while(k>0)
{
if(c[i][j]==c[i-1][j])i--;
else if(c[i][j]==c[i][j-1])j--;
else
{
str[--k]=a[i-1];
i--;j--;
}
}
return str;
}
int main()
{
string a,b;
cout<<"enter two strings\n";
cout<<"enter first string:";
cin>>a;
cout<<"enter second string:";
cin>>b;
cout<<bulid_lcs(str,a,b);
system("PAUSE");
return 0;
}

foochow 2005-07-12
  • 打赏
  • 举报
回复
KMP模式匹配算法,书上都有直接的算法,自己看看
jixingzhong 2005-07-12
  • 打赏
  • 举报
回复
提供另外一个算法,


给予参考:


1 字符串S1、S2(子串),字符指针TEMP

2 S2长度为L

3 把S1中从第一个字符开始,L长度字符复制给TEMP

4 对TEMP和S2进行比较,(好象可以用一个内存函数)

5 把S1中从第二个字符开始,L长度字符复制给TEMP

6 比较

~~~~~~~~~~~~~~~~~~~~~~~~~


类推



这个问题是要求S1、S2长度相差不大才好用,否则效率不高!!!

Willpro 2005-07-12
  • 打赏
  • 举报
回复
int pos(char *source, char *template)
{
char *t= NULL;
int i, match, n;
n=0;

if(source == NULL || template == NULL)
{
return -1;//for wrong pointer
}

t = template;
while(*source!='\0')
{
n++;
if(*source!=*template)//Èç¹ûµÚÒ»¸ö×Ö·û²»Í¬£¬¾Í¼ÌÐøɨÃèÔ­´®µÄÏÂÒ»¸ö×Ö·û
{
source++;
}
else//Èç¹ûÏàͬ£¬¾Í±È½ÏÁ½¸ö´®
{
match=1;

for (i = 0; i<strlen(template); i++)
{
if (template[i]!=source[i])
{
match=0;
break;
}
}
if(match==1)
{
return n;
}
}
}
}
极速小王子 2005-07-12
  • 打赏
  • 举报
回复
给你点提示:kmp算法

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧