请教一个求字符串频率的问题

3661512 2005-05-25 08:40:41
字符串统计:输入两个字符串,一个长串,一个短串,计算短串在长串中出现的频率.

要求:用标准的C语言完成,不允许调用任何系统库函数,并且只能用一层循环.


...全文
135 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alonefield 2005-06-06
  • 打赏
  • 举报
回复
楼上犯了一个错误,用KMP寻找的复杂度应当为 O(m+n)
正确的做法是在模式串最后添加一个不可能出现的字符,进行匹配。
匹配到最后一个字符的时候计数器加1即可。
AdenPlus 2005-05-26
  • 打赏
  • 举报
回复
没想到给楼主抢先了,没错,就是KMP
Zephyrzzz 2005-05-26
  • 打赏
  • 举报
回复
用KMP吧,用的是一重循环,其实最坏情况也是O(nm)的,因为计算次数时i指针要回溯.

int get_next(char p[]){
int i=0,j=-1;
next[0]=-1;
while(i<n2-1){
if(j==-1||p[i]==p[j]){
i++;j++;
if(p[i]!=p[j])next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
return 0;
}

int KMP(char S[],char P[]){
int i=0,j=0,freq=0;
while(i<n1){
if(j==-1||S[i]==P[j]){
i++;j++;
}
else j=next[j];
if(j>=n2) freq++,i-=n2-1;
}
return freq;
}

void main()
{
scanf("%s",s);
scanf("%s",p);
n1=strlen(s); //不准用strlen就自己写个循环吧^_^
n2=strlen(p);
get_next(p);
printf("%d\n",KMP(s,p));
}
3661512 2005-05-26
  • 打赏
  • 举报
回复
怎么没有人啊,我自己顶
sunman1982 2005-05-25
  • 打赏
  • 举报
回复
up
3661512 2005-05-25
  • 打赏
  • 举报
回复
这是我写的双循环的方法
int PingLv(char *szStr,char *szSubstr)
{
int n = 0,k = 0,nStr,nSubstr,nCount = 0;
nStr = strlen(szStr);
nSubstr = strlen(szSubstr);
for(n = 0;n < nStr;n++)
{
for(k = 0 ;k < nSubstr;k++)
{
if(szStr[n+k] != szSubstr[k])
break;
else
{
if(k == nSubstr - 1)
nCount++;
}
}
}
return nCount;
}

int szlen(char *szStr)
{
int nlen = 0;
while(szStr[nlen] != 0)
nlen++;
return nlen;
}
3661512 2005-05-25
  • 打赏
  • 举报
回复
to sunman1982
大哥,用C啊,而且不能用任何库函数,sizeof,strlen这些都不能用.
sunman1982 2005-05-25
  • 打赏
  • 举报
回复
呵呵 只是能工作而已……
sunman1982 2005-05-25
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>

using namespace std;

int main()
{
int i=0;
string s1("abcdabcdabs1cd"),s2("ab"),s3;
string::size_type pos=0;
int Len1=s1.size();
int Len2=s2.size();
int x=Len1-Len2;
for(pos=0;pos<=x-1;++pos)
{
if(s1[pos]==s2[0])
{
s3=s1.substr(pos,s2.size());
if(s3==s2)
i++;
}
}
cout<<i<<endl;
system("pause");
}
3661512 2005-05-25
  • 打赏
  • 举报
回复
用两层循环的方法我已经做出来了,现在需要做一层循环,希望大家多多帮忙.
jp1984 2005-05-25
  • 打赏
  • 举报
回复
不可能只有一层循环, 因为涉及到模式匹配。

33,010

社区成员

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

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