通过提交解决方案和运行代码在LeetCode上获得不同的结果

时间:2018-07-24 08:52:20

标签: java c++

我正在研究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;
    }
};

两个输出是 enter image description here 我不知道我的代码有什么问题。此外,我的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;
    }
}

2 个答案:

答案 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