#include
#include
// 采用子串定位策略算法
int strrindex(char s[],char t[],int *pos){
int cHead[100]; // 计算子串首字母在母串的分布位置
int i; // 循环用的变量
int hLen=-1; // 记录定位到子串首字母的数量
int subLen=strlen(t); // 子串的长度
int mainLen=strlen(s);// 母串的长度
int findCount=0; // 找到的字串的数量
int curIndex=0; // 匹配时用要移动的下标
char cFirst=t[0]; // 子串首字母
bool isALL; // 匹配子串是否存在母串
for(i=0;i<100;i++) cHead[i]=-1;
for (i=0;iif(s[i]==cFirst) cHead[++hLen]=i; // 计算子串首字母在母串的分布位置
}
if(hLen<0) return 0; // 母串不存在这样的子串
for (i=cHead[curIndex];i{
isALL=false;
for(int j=0;j{
if(t[j]==s[i+j]) isALL=true;
else{
isALL=false;
break;
}
}
if (isALL)
{
findCount++;
*pos=i; // 保存子串最后一次出现的位置(下标)
}
curIndex++;
if(cHead[curIndex]!=-1) i=cHead[curIndex];
else i++;
}
return findCount; // 返回子串出现的次数
}
int main(void){
int i=0;
printf("子串在母串出现的次数:%d",strrindex("abcdkenefgkenweoia","ken",&i));
printf("\n最后一次字串在母串的位置:%d\n",i);
}
字符串匹配问题
简单的就BF算法
快点就Kmp,BM算法
给你一KMP算法的实现:
#include
#include
// 在 a 中的第 pos 之后的位置找 b 串
int kmp(char *a, char *b, int pos)
{
int next[50] = {0};
int lena = strlen(a);
int lenb = strlen(b);
int i, j;
// 生成改进的 next 数组
// a a a b
// -1 0 1 2 原来的情况
// -1 -1 -1 2 改进后的
next[0] = -1; // -1 表示不能再回溯 j 了
j = -1; // 开始 j==-1 表示字符串到头了,
i = 0; // i 从第一个字符开始
while (i < lena)
{
if (j == -1 || b[i] == b[j])
{
i++; j++;
if (b[i] == b[j]) next[i] = j;
else next[i] = next[j];
}
else j = next[j]; // 匹配失败时, 回到 next[j]
}
// 开始 kmp 算法
i = pos;
j = 0;
while (i < lena && j < lenb)
{
if (j == -1 || a[i] == b[j]) {i++; j++;}
else j = next[j]; // 回溯 j 指针
}
if (j == lenb) return i - j + 1;
return -1;
}
int main(void)
{
char a[500];
char b[100];
int flag;
int pos;
printf("请输入主串: ", a);
gets(a);
printf("请输入模式串: ");
gets(b);
printf("请输入开始匹配位置: ");//输入0就从头开始匹配
scanf("%d", &pos);
flag = kmp(a, b, pos-1);
if (flag >= 0)
printf("匹配成功!\n位置: %d\n", flag);
else
printf("匹配失败!\n");
return 0;
}
//自己弄文件输出
#include
int strindex(const char* p, const char* c, int *pos)
{
const char* cp = p;
const char* cc = c;
const char* sp = p;
int cnt = 0;
if (!p || !c || !pos) return 0;
while (*p)
{
if (*p == *c){
cp = p+1;
cc = c+1;
while (*cc && *cc == *cp){cc++; cp++;}
if (! *cc){
*pos = p - sp;
cnt++;
printf("got %s\n", p);
if (*cp){
p = cp;
continue;
}
}
if (! *cp) return cnt;
}
p++;
}
return cnt;
}
int main()
{ int cnt;
int pos = 0;
cnt = strindex("aa abc abcabcabcdefabc", "abc", &pos);
if (cnt)
printf("%d %d\n", cnt, pos);
cnt = strindex("aa abcacab", "aa", &pos);
if (cnt)
printf("%d %d\n", cnt, pos);
return 0;
}
排序算法错误。
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
input越界。n个数只需要比较n-1次,就能找到最大的。