【力扣522.最长特殊序列Ⅱ】c++ string.length()与int变量比较大小踩坑

. - 力扣(LeetCode)

今天力扣每日一题中用到枚举+对比判断string子序列

因为子序列越长,越不可能是其它字符串的子序列。所以只需要枚举字符串 s=strs[i],判断 s是否为其它字符串的子序列,如果不是,则用 s的长度更新答案的最大值。

其中为了减少复杂度,应跳过s长度小于等于答案的情况(因为不会使得答案更大)

class Solution {
    // 判断 s 是否为 t 的子序列
    bool isSubseq(string& s, string& t) {
        int i = 0;
        for (char c : t) {
            if (s[i] == c && ++i == s.length()) { // 所有字符匹配完毕
                return true; // s 是 t 的子序列
            }
        }
        return false;
    }

public:
    int findLUSlength(vector<string>& strs) {
        int ans = -1;
        for (int i = 0; i < strs.size(); i++) {
            if ((int) strs[i].length() <= ans) { // 不会让 ans 变大
                continue;
            }
            for (int j = 0; j < strs.size(); j++) {
                if (j != i && isSubseq(strs[i], strs[j])) {
                    goto next;
                }
            }
            ans = strs[i].length();
            next:;
        }
        return ans;
    }
};

也就是这里:

if ((int) strs[i].length() <= ans) { // 不会让 ans 变大
                continue;
            }

在对比str[i].length()和当前最大值ans时博主没有加上(int)导致出错,并在ide上断点调试发现str[i].length()能打印出大于0的数字但是却比不过ans为-1的初始值,查阅资料发现在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据。因此比较大小时会将ans转为unsigned类型的int 数据,而ans初始值为-1又超出了unsigned范围,会变为2^32 - 1,因此总是执行continue从而结果出错。

因此在string.length()与int变量比较时最好是将size_type转为int类型,借此记录一下踩坑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值