我正在研究LeetCode问题Longest Substring Without Repeating Characters。但是我在运行代码和提交解决方案之间得到了两个不同的结果。我的C ++代码是
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int* a = new int[257];
int ans = 0;
int n = s.size();
for (int j = 0, i = 0; j < n; j++) {
i = i > a[s[j]] ? i : a[s[j]];
ans = ans > j - i +1 ? ans : j - i + 1;
a[s[j]] = j + 1;
}
return ans;
}
};
两个输出是 我不知道我的代码有什么问题。此外,我的C ++代码是通过学习他的网站Java答案来编写的
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
int[] index = new int[128]; // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}
}
答案 0 :(得分:2)
for (int j = 0, i = 0; j < n; j++) {
i = i > a[s[j]] ? i : a[s[j]];
由于a
未初始化,因此a[s[j]]
是未定义的行为。你想要
for (int i=0;i<257;i++)
a[i]=0;
或更佳的vector
vector<int> a(257,0);
答案 1 :(得分:1)
与Java不同,C ++不会为您将堆内存归零。
int* a = new int[257];
数组a
中的数据是什么?
在Java中,a[0], a[1], ... a[256]
都等于零。但是在C ++中,a[0], a[1], ... a[256]
包含来自该内存地址之前的任何数据的随机垃圾。
您必须先将内存清零:
std::fill_n(a, 257, 0);
或者,如果您更喜欢memset
:
std::memset(a, 0, sizeof(int) * 257);
编辑:正如@ It'scominghome所指出的,还可以进行值初始化(C ++ 11):
int* a = new int[257](); // will zero the array