当我试图找出为什么我为 leet 代码问题编写的解决方案不起作用时,问题就出现了。
这是我的代码
#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
int main() {
string s = "au";
std::set < char > mems;
int ans = 0;
for (int i = 0; i <= s.length(); i++) {
for (int j = i; j <= s.length(); j++) {
if (mems.count(s[j]) == 1) {
if (j - i > ans) { ans = j - i; }
i = j - 1;
j = s.length();
mems.clear();
}
else {
mems.insert(s[j]);
}
}
}
if (s.length() == mems.size()) { ans = s.length(); }
for (auto item : mems)
std::cout << item << endl;
cout<<mems.size() << "";
}
下面的代码表明mems的大小为1,但同时,当我尝试打印它的项目时,它什么也没显示。这怎么可能?我在网上查了一下集合的最小大小,发现它是 0.. 所以这个问题也与此无关。
预期行为应该是 mems.size()==2
您的 for 循环从 0,1,2(包括 2)开始迭代,您可能无意这样做。更换您的 <= check to strict < to avoid this. On the other hand, what happens here, is that you're accessing s string of size 2 at position 2, which returns a null character (0 or '\0') according to the standard.
用字符串初始化时 std::strings 是否以 ' ' 结尾?
所以最后 mems 包含一个 0 字符,当你打印它时,它不会执行任何操作,就像打印一个空字符串一样。 这里在索引 2 处返回 null 字符串的原因可能与 c 字符串有关,c 字符串总是以 null 结尾,以便更容易打印它们。 例如:
const char* str = "foo";
printf("%s\n", str);
这会打印“foo”,但是printf并不真正知道str的大小,它只是一个指针,但是当它遇到0时,它会停止。 作为实验,您可以将 str 替换为
const char* str = "f\0oo";
然后只打印字母 f