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 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)