为什么它没有进入 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
不能表示负数如-999
(MaX
的初始值)
解决这个问题的一种方法是显式地将 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)
我正在 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
不能表示负数如-999
(MaX
的初始值)
解决这个问题的一种方法是显式地将 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)