这道题上遇到了谜之Bug,现在还没解决。

问题描述

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1.

想法与实现

这道题感觉上比较容易想的方法就是维护首尾两个指针,首尾指针之间的就是可能的不重复字符串,然后根据相应的规则更新两个指针,然后记录两指针相差的最大距离就好。时间复杂度也是O(n)线性的,代码如下~

int lengthOfLongestSubstring(string s) {
    int i = 0;
    int j = 0;
    int length = s.size();
    int buf = 0;
    int result;
    map<char, bool> hashTable;
    while (i < length && j < length)
    {
    	if (hashTable.find(s[j]) != hashTable.end())
        {
            hashTable.erase(hashTable.find(s[i]));
            i++;
            buf--;
            continue;
        }
        else
        {
            while (hashTable.find(s[j]) == hashTable.end() && j < length)
            {
                hashTable.insert(pair<char, bool>(s[j], true));
                buf++;
                if (buf > result)
                    result = buf;
                j++;
            }
        }
    }
    return result;
}

Notice

不过值得注意的是,我的这段代码不是能百分百AC的,是有时AC有时不能AC,不能AC的话是从第一个测试用例开始就出错,截图如下~

失败提交
失败提交

我至今还是不能理解到底是哪里出了问题,如果WA,就会出现一个非常大的数字,感觉可能是指针,数据越界之类的问题,但是有时又是可以AC的,有点搞不懂。

另一个问题

跟上面的问题遥相呼应的,是这样一个问题:在我做这道题的时候,有这么一个写法,当然这个写法是不可能AC这道题的,是肯定错误的~

int lengthOfLongestSubstring(string s) {
    int i = 0;
    int j = 0;
    int length = s.size();
    int buf = 0;
    int result;
    map<char, bool> hashTable;
    for (i = 0; i < length; i++)
    {
    	if (hashTable.find(s[j]) != hashTable.end())
        {
            hashTable.erase(hashTable.find(s[i]));
            buf--;
            continue;
        }
        else
        {
            hashTable.insert(pair<char, bool>(s[j], true));
            buf++;
            if (buf > result)
                result = buf;
            j++;
        }
    }
    return result;
}

但是好戏来了,当我的main函数这样的时候~

int main()
{
    Solution s;
    string str = "cc";
    int x = s.lengthOfLongestSubstring(str);
    cout << x;
}

输出为

gaoce@gaocedeMacBook-Pro:~/GitHub/leetcode$ ./a.out
16777216gaoce@gaocedeMacBook-Pro:~/GitHub/leetcode$

然后main函数加一行输出换行,就变成下面这样的时候~

int main()
{
    Solution s;
    string str = "cc";
    int x = s.lengthOfLongestSubstring(str);
    cout << x;
    cout << endl;

}

接下来就是见证奇迹的时刻,输出变成了~

gaoce@gaocedeMacBook-Pro:~/GitHub/leetcode$ ./a.out
1
gaoce@gaocedeMacBook-Pro:~/GitHub/leetcode$

我感觉这两个问题间存在一定联系,因为都是输出会成为一个很大的数字,但是还是不太清楚是哪里出了问题,感觉很奇怪啊,希望能得到指点。

评论