求解 字符串及其应用

Zhangjiwen521 2010-04-20 02:58:16
问题描述:
统计一段文字(英文字符串)中,指定关键字(由用户从终端输入)的出现次数和第一次出现的位置。
例如用户输入:x abc df ab cks abc sdf
abc
则程序输出:abc出现2 次
首次出现在3号位
...全文
209 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
GentooEmacs 2010-05-08
  • 打赏
  • 举报
回复
dawnkeen 2010-04-28
  • 打赏
  • 举报
回复
很简单的!!!
曦轩 2010-04-28
  • 打赏
  • 举报
回复
用库的话strstr()搞定,自己写的话用KMP,不过KMP效率已经不算高的了
GentooEmacs 2010-04-27
  • 打赏
  • 举报
回复
给你写好了,结贴给分吧,不懂的话在我空间留言,给你解释一下。



#include<iostream>
using namespace std;
char c[1024],s[1024];
char*p=c;
void mach(char*c, char*s,int&n,int&flag )//c[]为原数组,s[]为关键字部分
{
int i,j;
i=0;j=0;
while(c[i]!='\0'&&c[i]!=' '&&s[j]!='\0')
{
if(c[i]==s[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==strlen(s)&&(c[j]==' '||c[j]=='\0'))
{if(n==0)flag=c-p;

n++;
mach(c+j,s,n,flag);
}
else if(c[i-j+1]!='\0')mach(c+i-j+1,s,n,flag);


}
int main()
{
gets(c);int n=0;puts(c);int flag=0;
cout<<"关键字\n";
gets(s);
mach(c,s,n,flag);
cout<<"匹配个数"<<n<<endl;
cout<<"第一次出现位置"<<flag+1<<endl;
return 0;
}

lingling1989r 2010-04-22
  • 打赏
  • 举报
回复
你这个例子都有空格分隔的.那就比要用KMP的题目简单了,这个输入都这样的么?
renzhewh 2010-04-22
  • 打赏
  • 举报
回复
strstr 即可完成,不需自己造轮子
owt5008137 2010-04-20
  • 打赏
  • 举报
回复
KMP算法
直接把我以前写的模板拿来改了一点就发来了
原文:http://www.owent.net/part/Article/?id=1

代码如下:
//kmp模式匹配
//算法复杂度O(m+n)
typedef int kmp_counter;
#define kmp_matchChar(a,b) (a==b)
//可根据被匹配字符串长短修改类型和大小
//同时注意修改下面的i和j的类型和返回类型
kmp_counter posLastMatch[10000]={0};
kmp_counter kmp_match(char *source,char *checked, kmp_counter &num)
{
kmp_counter i,j;
i = j = 0;
if(*(checked + i))
{
i ++;
while(*(checked + i))
{
for(j = posLastMatch[i - 1] ; !kmp_matchChar(*(checked + i) , *(checked + j)) && j ; j = posLastMatch[j - 1]);
posLastMatch[i] = (kmp_matchChar(*(checked + i) , *(checked + j)))? j + 1 : 0 ;
i ++;
}
//计算匹配子串个数(子串间无重叠)
num = 0;//计数变量
for(i = j = 0 ; *(source + i) ; i ++)
{
if(kmp_matchChar(*(checked + j) , *(source + i)))
j ++;
else if(j)
i --, j = posLastMatch[j - 1];
if(!*(checked + j))
num ++,j = 0;//如果要子串间重叠 则此句中j=0 改成 j = posLastMatch[j - 1]
}
//计算首个匹配子串位置
for(i = j = 0 ; *(checked + j) && *(source + i); i ++)
{
if(kmp_matchChar(*(checked + j) , *(source + i)))
j ++;
else if(j)
i --, j = posLastMatch[j - 1];
}
if(!*(checked + j) )
return i - j + 1;
else
return 0;
//返回匹配的串的第一个字符出现位置(从1开始计数,0表示无匹配)
}
return 0;
}

使用的时候运行
d = kmp_match(a,b,c);
就是从a里匹配b,d为起始位置,c为匹配数量
hellodota121 2010-04-20
  • 打赏
  • 举报
回复
字符串匹配,kmp算法
canoe982 2010-04-20
  • 打赏
  • 举报
回复
如果只是要程序,使用语言中的字符串操作函数可以很方便的实现了。
zhangxr123 2010-04-20
  • 打赏
  • 举报
回复
楼主这个是要程序?简单的匹配算法就可以搞定了撒
michael122 2010-04-20
  • 打赏
  • 举报
回复
字符串匹配,kmp算法
内容概要:本文深入探讨了回文串的概念、特性、检测方法及其广泛应用。回文串是指那些正读与倒读相同的特殊字符串,在多个领域有着重要意义和应用价值。文中首先阐述了回文串的定义及其特征,并从数学角度讨论了其理论价值。接着介绍了三种主要的回文串检测方法:双指针法、中心扩展法和动态规划法,每种方法均有详细的解释及优缺点分析。此外,文章提到了回文串的实际应用场景,比如文学创作、编程竞赛中的难题求解以及信息安全中的密码编制等。最后探讨了近年来关于回文串研究的新成果和发展趋势,特别是在生物科技、信息检索等方面的新兴研究方向。 适合人群:从事计算机科学研究的技术人员;对字符串处理算法感兴趣的程序员;关注跨学科研究(尤其是生物信息学)的研究学者及学生。 使用场景及目标:帮助读者了解并掌握高效的回文串判别方法和技术;增强对于对称性的认识;启发在新领域能否引入类似的思路或概念,以促进相关领域的创新发展。 其他说明:本文旨在全面覆盖回文串的相关知识,既注重学术价值也强调实际应用效果。无论是希望通过学习提升自我技能的专业人士还是仅仅因为好奇想要了解更多细节的一般读者都能从中受益。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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