社区
数据结构与算法
帖子详情
求解 字符串及其应用
Zhangjiwen521
2010-04-20 02:58:16
问题描述:
统计一段文字(英文字符串)中,指定关键字(由用户从终端输入)的出现次数和第一次出现的位置。
例如用户输入:x abc df ab cks abc sdf
abc
则程序输出:abc出现2 次
首次出现在3号位
...全文
234
12
打赏
收藏
求解 字符串及其应用
问题描述: 统计一段文字(英文字符串)中,指定关键字(由用户从终端输入)的出现次数和第一次出现的位置。 例如用户输入:x abc df ab cks abc sdf abc 则程序输出:abc出现2 次 首次出现在3号位
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
GentooEmacs
2010-05-08
打赏
举报
回复
经典之作:
http://acm.hdu.edu.cn/showproblem.php?pid=1030
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 即可完成,不需自己造轮子
十八道胡同
2010-04-21
打赏
举报
回复
kmp算法
http://blog.csdn.net/LCL_data/archive/2010/04/21/5513517.aspx
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算法
算法学习之暴力
求解
暴力
求解
(brute force) Brute force is a straightforward approach to solving a problem, usually directly based on the problem statement and definitions of the concepts involved. 暴力
求解
即根据问题的描述和定义直接
求解
,不使用一些特殊
字符串
KMP——用途广泛的
字符串
匹配算法 + 扩展KMP——特殊定义的
字符串
匹配
虽说是省选知识,但是NOIP可以考
KMP题目
求解
详细步骤笔记
title: KMP学习笔记 tags: 数据结构,KMP,学习日常 KMP根据题目
求解
next[],nextval[]详细步骤笔记 伪代码来自严书第二版,题目来自配套习题册 1.next[]
求解
严书伪代码如下: void get_next(SString T, int[] next){ i = 1,next[i]=0,j=0; while(i<T.length){ if(j==0||T.ch[i]==T.ch[j]){ j++; i++;
字符串
Hash-
字符串
Hash可以理解为,把一个
字符串
转换为一个整数。 如果我们通过某种方法,将
字符串
转换为一个整数,就可以便的确定某个
字符串
是否重复出现过。 Hash方法 给定一个
字符串
S=s1s2s3…sn S = s_1s_2s_3…s_nS=s 对字母x,我们规定idx(x)=x−′a′+1。 公式: hash[i]=hash[i−1]∗p+id(s[i])。 单Hash方法: 公式: hash[i]=(...
KMP经典算法与变形的
应用
(
字符串
parttern匹配问题)
KMP经典算法与变形的
应用
(
字符串
parttern匹配问题) 1. 问题描述 求主串
字符串
a是否含有模式串
字符串
parttern b,也就是匹配问题经典KMP算法是计算next[j]数组,然后每次移动若干位而不是暴力
求解
的每次移动到partern的首位来比较。 暴力
求解
的算法很明显时间复杂度是O(m*n),而KMP(三个发明者的首字母)算法 的时间复杂度是O(m+n),为什么时间复杂度是O...
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章