最长公共子词错误结果

Posted

技术标签:

【中文标题】最长公共子词错误结果【英文标题】:longest common subword incorrect result 【发布时间】:2017-11-01 10:02:44 【问题描述】:

我一直在尝试编写一个程序来计算两个字符串共有的最长公共连续序列(或子字)。代码可以正常工作,没有任何语法错误,但每次我得到像 237743 等乱码的随机结果时,希望有人能找出我哪里出错了。 例如, 如果我输入第一个单词为“stack”,第二个单词输入为“***”,它应该给出 5(common word=stack,length 5) 的输出,但它给了我 '2752053'

#include <iostream>

using namespace std;

int getlcw(char arr1[],char arr2[])

    u=sizeof(arr1)/sizeof(arr1[0]);
    v=sizeof(arr2)/sizeof(arr2[0]);
    if(u==0||v==0)
       cout<<"fail";
        return 0;
    
    int lcw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
    int maxlcw=0;
    for(int i=0;i<u+1;++i) \\intialise last row and col to 0
    
        lcw[i][v+1]=0;
    
    for(int i=0;i<v+1;++i)
    
        lcw[u+1][i]=0;
    
    for(int i=u;i>=0;--i)
    
        for(int j=v;j>=0;--j)
        
            if(arr1[j]==arr2[i])
                lcw[i][j]=1+(lcw[i+1][j+1]);
            else
                lcw[i][j]=0;
            if(lcw[i][j]>maxlcw)
                maxlcw=lcw[i][j];
        
    
    return maxlcw;
    

int main()
   int x,y;
    cout<<"enter size of word 1\n";
    cin>>x;
    char arr1[x];
    cout<<"enter size of word 2\n";
    cin>>y;
    char arr2[y];
    cout<<"word 1\n";
    for(int i=0;i<x;++i)
    
        cin>>arr1[i];
    
    cout<<"word 2\n";
    for(int j=0;j<y;++j)
    
        cin>>arr2[j];
    
    int ans=getlcw(arr1,arr2);
    cout<<ans;
    cin>>x;


这是我得到算法想法的链接 -

https://www.iarcs.org.in/inoi/online-study-material/topics/dp-classics.php

【问题讨论】:

你需要调整你的“一切似​​乎都很好”的概念,并学习如何使用调试器 添加一个具有预期和产生结果的示例。尝试调试! 这样做了。对不起,我是这个地方的新手。 一般来说,检查你的数组索引...如果你有一个长度为x的数组,有效的索引在[0, x-1]的范围内。如果您尝试访问索引[x],它将超出范围 - 您在代码中经常这样做。 【参考方案1】:

你可以通过两种方式解决它,复习一下:

自上而下的方法:

int getlcw(char arr1[],char arr2[])

    u=sizeof(arr1)/sizeof(arr1[0]);
    v=sizeof(arr2)/sizeof(arr2[0]);
    if(u==0||v==0)
       cout<<"fail";
        return 0;
    
    int lcsw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
    int maxlcw=0;


    for(int i=0; i<u+1;i++)
    
        for(j=0; j<v+1; j++)
        
            if(i == j)              lcsw[i][j] = 0;
            if(arr1[i]!= arr2[j])   lcsw[i][j] = 0;
            else                    
            
                                    lcsw[i][j] = 1+lcsw[i-1][j-1];
                                    maxlcw= max(maxlcw, lcsw[i][j]);
            
        
    

    return maxlcw;

自下而上如您所愿:

int getlcw(char arr1[],char arr2[])

    u=sizeof(arr1)/sizeof(arr1[0]);
    v=sizeof(arr2)/sizeof(arr2[0]);
    if(u==0||v==0)
       cout<<"fail";
        return 0;
    
    int lcsw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
    int maxlcw=0;

    for(int i=u;i>=0;i--)
    
        for(int j=v;j>=0;j--)
        
            if(i == j)              lcsw[i][j] = 0;
            if(arr1[i]!= arr2[j])   lcsw[i][j] = 0;
            else                    
            
                                    lcsw[i][j] = 1+lcsw[i+1][j+1];
                                    maxlcw= max(maxlcw, lcsw[i][j]);
            
        
    

【讨论】:

以上是关于最长公共子词错误结果的主要内容,如果未能解决你的问题,请参考以下文章

具有错误字符容差的最长公共子串

最长公共子串与最长公共子序列之间的关系

最长公共子序列未显示结果

算法 动态规划 ------最长公共子序列

最长公共子序列长度函数没有返回正确的长度?

最长公共子序列 LCS