最长的常见子字错误结果

longest common subword incorrect result

本文关键字:错误 结果 常见      更新时间:2023-10-16

我一直在尝试编写一个程序来计算两个字符串共有的最长的公共连续序列(或子词)。代码没有任何语法错误,但每次我得到胡言乱语的随机结果,如237743等,希望有人能找出我哪里出错了。例如如果我输入第一个单词作为"堆栈",第二个单词作为"堆栈溢出",它应该给出 5 的输出(常用字=堆栈,长度 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 1n";
    cin>>x;
    char arr1[x];
    cout<<"enter size of word 2n";
    cin>>y;
    char arr2[y];
    cout<<"word 1n";
    for(int i=0;i<x;++i)
    {
        cin>>arr1[i];
    }
    cout<<"word 2n";
    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

您可以通过两种方式解决它,请查看它:

自上而下的方法:

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]);
            }
        }
    }
}