c语言问题,急求

2025-02-26 16:20:46
推荐回答(4个)
回答1:

#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;i if(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);
}

回答2:

字符串匹配问题

简单的就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;
}

//自己弄文件输出

回答3:

#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;
}

回答4:

排序算法错误。
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
input越界。n个数只需要比较n-1次,就能找到最大的。