首页 > 解决方案 > 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);
    }
};

标签: c++

解决方案


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]。如果ij元素相等,那么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;
    }

随时要求进一步澄清和/或解释。


推荐阅读