c++ - c++ 中的这种语法是什么意思?
问题描述
我从某人那里找到了一个代码来解决代码问题,但我真的不明白这一行
if(!(dp[i] = dp[i + 1] || str[i] != str[j]) && (e - s) <= (j - i))
,数组“dp”到底是做什么的?是什么dp[i] = dp[i+1]
意思?不是分配dp[i+1]
给dp[i]
???这是代码。
class Solution {
public:
string longestPalindrome(string str) {
const int n = str.size();
if(n < 2) return str;
int s = 0, e = 0;
int dp[n] = {0, };
for(int j = 0; j < n; ++j){
for(int i = 0; i < j; ++i){
if(!(dp[i] = dp[i + 1] || str[i] != str[j]) && (e - s) <= (j - i))
s = i, e = j;
}
}
return str.substr(s, e - s + 1);
}
};
解决方案
dp[i] = dp[i+1] 是什么意思?不是将 dp[i+1] 分配给 dp[i]
不完全是!由于||
运算符的优先级高于=
运算符,因此赋值实际上等价于:
dp[i] = ( dp[i+1] || (str[i] != str[j]) );
但是 中的所有表达式C++
都有一个值和一个效果。在赋值的情况下,就像这里的一样,表达式的值与最终分配的值(给 LHS)相同。因此,在这里,表达式的值将等于dp[i + 1]
与比较结果进行逻辑或运算的值str[i] != str[j]
。如果i
和j
元素不相等,那么dp[i]
将被赋予1
; 如果它们是相同的,它将被赋予 的值dp[i+1]
。
在逻辑测试条件中使用这个表达式可以实现两件事:
- 首先,它完成了任务(如预期的那样)
- 其次,它检查分配的值是否非零(“真”)。
第二点用于进一步评估整个if
语句。
由于这是要评估的第一个表达式,因此可以更清楚地(尽管不太简洁)编写代码,如下所示:
for(int i = 0; i < j; ++i){
dp[i] = dp[i + 1] || (str[i] != str[j]); // Do the assignment...
if((dp[i] == 0) && (e - s) <= (j - i)) // ... then test dp[i]
s = i, e = j;
}
随时要求进一步澄清和/或解释。
推荐阅读
- c - ZeroMQ 示例的网络诊断
- javascript - 有没有办法在 set.formula 中添加一个变量以在 for 循环中使用
- c# - 从 System.Runtime.InteropServices.Marshal C# 中找不到 GetActiveObject 的定义
- python-3.x - 即使用户输入是小写字母或大写字母,我也想删除该元素
- java - Java 和我需要帮助来理解要写出的代码
- c++ - 编译器如何将链表中的地址串在一起?
- json - 重复对象的 JSON 模式数组
- c# - Selenium C# 标签文本单击
- python - 不显示添加到 networkx 图的一个节点的图像
- java - Java 8 - 将轻元素从另一个 Map 放入目标 Map