通配符 查找字符串

h_5_hao 2009-01-08 09:40:37
编写函数int FindString(char *source, char *pattern),该函数统计字符串source中出现的所有符合pattern模式串的任意长度的子串总数。其中pattern模式串的两头可能含有通配符’*’,该通配符表示零到任意个数个字符。
例如:FindString(”aaabbb”,”*aa*”) 则返回值为9(aa,aaa,aaab,aaabb,aaabbb,aa,aab,aabb,aabbb)。

我写了一半
#include <stdlib.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
int FindString(char *source, char *pattern);


int main()
{
int num=0;
num=FindString("abcbbc","*bc");
printf("%d",num);
system("pause");
return 0;
}
int FindString(char *source, char *pattern)
{
int num=0,key=0;
int i=0,j=0;

for (i=0;*(pattern+i)!='\0';i++)
{
if (*(pattern+i)=='*')
{
key++;
}
}
if(key==0)
{
for (i=0;*(source+i)!='\0';i++)
{
if (*(source+i)==*(pattern))
{
for ( j=0;*(pattern+j)!='\0'&&*(source+j+i)!='\0';j++)
{
if (*(pattern+j)!=*(source+j+i))
{
break;
}

}
if (*(pattern+j)=='\0')
{
num++;
}
}
}
return num;

}
if (key==1)
{

。。。。。。。。

}

}


}

通配符我准备分情况考虑 但是觉得我写的很复杂 请教好点的做法 谢谢

...全文
149 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenchangxiong 2009-01-08
  • 打赏
  • 举报
回复
公式推导错了 自己先汗一个
chenchangxiong 2009-01-08
  • 打赏
  • 举报
回复
假设字符串为a1 a2 ......an
从i到j 符合要求的个数为S(i,j)
应当注意到
在字符串包含给定子串的情况下

s(1,n)=s(1, n-1)+ s(2, n)+1
=s(1, n-2)+2s(2,n-1)+s(3,n)+2^2-1
=求和(C(i-1,k)s(i,n-k-i))+2^k-1
=求和(C(i-1,n-2)s(i, i+1))2^(n-2)-1
这样问题问题转化为纯排列的问题,楼主应当可以自己做了吧
zhan1094 2009-01-08
  • 打赏
  • 举报
回复
可以化简为排列问题?!
先找出patten字符串后面有多少个字符,再给这些字符排列~~~
h_5_hao 2009-01-08
  • 打赏
  • 举报
回复
通配符只有*
太乙 2009-01-08
  • 打赏
  • 举报
回复
通配符只有*me ?

69,371

社区成员

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

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