Yanmo霍染 2022-06-03 16:02 采纳率: 88.9%
浏览 12
已结题

求最长子序列代码错误如何修改?

问题遇到的现象和发生背景

求最长子序列,怎么输入都是输出最短的那个,或是一个拼接答案,该怎么改?

问题相关代码,请勿粘贴截图
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define MAX 64

typedef struct node{
    char data[MAX];
    int length;
}SqString;

void StrAssign(SqString *s,char cstr[])
{ 
    int i;
    for (i=0;cstr[i]!='\0';i++)
    s->data[i]=cstr[i];
    s->data[i]='\0';
    s->length=i;
}

SqString* SubStr(SqString *s,int i,int j)
{ 
    SqString* str;
    int k;
    str->length=0;
    if (i<0 || i>s->length || j<0 || i+j-1>s->length)
    return str; //参数不正确时返回空串
    for (k=i;k<i+j-1;k++) //s->data[i..i+j]?str
    str->data[k-i]=s->data[k];
    str->length=j-1;
    return str;
}

bool SubContains(SqString* s1,SqString* temp)
{
    int i = 0, j = 0, flag = -1;
    while (i < s1->length && j < temp->length)
    {
        if (s1->data[i] == temp->data[j])
        { 
            i++;
            j++;
        }
        else
        {
            i = i - j + 1; //主串字符回到比较最开始比较的后一个字符
            j = 0;         //字串字符重新开始
        }
        if (j == temp->length)
        {             //如果匹配成功
            flag = 1; //字串出现
            break;
        }
    }
    return flag;
}

SqString* MaxSubstring(SqString* s1,SqString* s2){  
    SqString* max,*min; 
    max=(s1->length>s2->length)?s1:s2;  
    min=(max==s1)?s2:s1;  
    for(int i=0;i<min->length;i++)  
    {  
        for(int j=0,k=min->length-i;k!=min->length+1;j++,k++)  
        {  
            SqString* temp=SubStr(min,j,k-j-1);  
            if(SubContains(max,temp))  
                return temp;  
        }  
    }  
    return 0;  
}  
int main(){
    char a1[100],a2[100];
    SqString* s,s1,s2; 
    printf("请输入第一个字符串:"); 
    gets(a1);
    printf("请输入第二个字符串:"); 
    gets(a2);
    StrAssign(&s1,a1);
    StrAssign(&s2,a2);
    s=MaxSubstring(&s1,&s2);  
    printf("%s",s->data);
    return 0;
}


运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-06-03 16:24
    关注

    img


    给你写出来了,看我的。

    
    //最大公共子序列的问题
    #include <stdio.h>
    #include <string.h>
    #define MAXSIZE 200
    int c[200][200];
    int b[200][200];
    char f[200];
    void print(int i, int j, int s, char x[], char y[]);
    int max(int m, int n, int i, int j) // c[i][j-1].c[i-1][j]
    {
        if (m > n) {
            b[i][j] = 1;
            return m;
        } else {
            b[i][j] = -1;
            return n;
        }
    }
    int LCS(char x[], char y[]) {
        int i, j;
        int m, n;
        m = strlen(x);
        n = strlen(y);
        for (i = 0; i < m + 1; i++)
            c[i][0] = 0;
        for (j = 0; j < n + 1; j++)
            c[0][j] = 0;
        for (i = 1; i <= m; i++) {
            for (j = 1; j <= n; j++) {
                if (x[i - 1] == y[j - 1]) {
                    b[i][j] = 0;
                    c[i][j] = c[i - 1][j - 1] + 1;
                } else {
                    c[i][j] = max(c[i][j - 1], c[i - 1][j], i, j);
                }
            }
        }
        printf("X和Y的LCS是:");
        print(m, n, c[m][n], x, y);
        printf("%s\n", f);
        return c[i - 1][j - 1];
    }
    void print(int i, int j, int s, char x[], char y[]) {
        if (b[i][j] == 0) {
            f[s - 1] = x[i - 1];
            i--;
            j--;
            s--;
            print(i, j, s, x, y);
        } else if (b[i][j] == 1) {
            j--;
            print(i, j, s, x, y);
        } else if (b[i][j] == 1) {
            i--;
            print(i, j, s, x, y);
        }
    }
    int main() {
        char x[MAXSIZE];
        char y[MAXSIZE];
        printf("你要输入的X字符串为:");
        scanf("%s", x);
        printf("你要输入的Y字符串为:");
        scanf("%s", y);
        int s = LCS(x, y);
        printf("公共子序列长度为:%d\n", s);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月11日
  • 已采纳回答 6月3日
  • 创建了问题 6月3日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真