今天力扣每日一题中用到枚举+对比判断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类型,借此记录一下踩坑。