为什么它没有进入 if 条件?

Why it is not entering inside if condition?

我正在 Geeksforgeeks 上解决一个问题,寻找字典中最大的单词。我相应地编写了代码,但卡在中间,因为流程没有进入主函数内部第二个 for 循环的 if 语句内部。

#include <iostream>
using namespace std;

int lcs(string s,string target)
{
    int m = s.size(),n = target.size();
    int dp[m+1][n+1];
    for(int i = 0;i<=m;i++)
    {
        for(int j =0;j<=n;j++)
        {
            if(i ==0 || j ==0)
                dp[i][j] = 0;
            else if(s[i] == target[j])
            {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            else
                dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
        }
    }
    return dp[m][n];
}
int main() {
    //code
    int t,n,loc=0,MaX = -999;
    cin>>t;
    for(int i= 0;i < t;i++)
    {
        cin>>n;
        string s[n];
        for(int j = 0;j<n;j++)
        {
            cin>>s[j];
        }
        string target;
        cin>>target;

        for(int j = 0;j<n;j++)
        { 
            int Lcs = lcs(s[j],target);
            cout<<"s["<<j<<"] s[j] size-> "<<s[j].size()<<" lcs size -> "<<Lcs<<" MaX value->"<<MaX<<"\n";

            // It is not entering inside this if condition
            if((s[j].size() > MaX) && (s[j].size() == Lcs))
            {
                cout<<"enter inside loop\n";
                MaX = s[j].size();
                loc = j;
            }
        }

        cout<<s[loc]<<"\n";

    }
    return 0;
}

输入:

2
4
ale apple monkey plea
abpcplea
4
pintu geeksfor geeksgeeks forgeek
geeksforgeeks

输出是这样的:

s[0] s[j] size-> 3 lcs size -> 3 MaX value->-999
s[1] s[j] size-> 5 lcs size -> 5 MaX value->-999
s[2] s[j] size-> 6 lcs size -> 2 MaX value->-999
s[3] s[j] size-> 4 lcs size -> 4 MaX value->-999
ale
s[0] s[j] size-> 5 lcs size -> 1 MaX value->-999
s[1] s[j] size-> 8 lcs size -> 8 MaX value->-999
s[2] s[j] size-> 10 lcs size -> 10 MaX value->-999
s[3] s[j] size-> 7 lcs size -> 7 MaX value->-999
pintu

预期输出(忽略调试输出):

apple
geeksgeeks

问题是您混合使用了有符号和无符号类型:s[j].size() 是无符号的,而 MaX 是有符号的。

具体来说,在我的平台上(x86_64 上的 gcc),s[j].size()unsigned long 类型。当您将 s[j].size()MaX 进行比较时,后者会转换为前者的类型,因为前者更宽。

但是unsigned long不能表示负数如-999MaX的初始值)

解决这个问题的一种方法是显式地将 s[j].size() 转换为有符号类型:

   for(int j = 0;j<n;j++)
   {
       int Lcs = lcs(s[j],target);
       int ssize = int(s[j].size());
       if(ssize > MaX && ssize == Lcs)
       {
           ...
       }
   }

使用 -Wconversion 编译会捕捉到这个:

NPE$ g++ -Wconversion test.cc
test.cc:50:27: warning: implicit conversion loses integer precision: 'std::__1::basic_string<char,
      std::__1::char_traits<char>, std::__1::allocator<char> >::size_type' (aka 'unsigned long') to 'int'
      [-Wshorten-64-to-32]
               MaX = s[j].size();
                   ~ ~~~~~^~~~~~
(more warnings omitted)