leetcode第三题--Longest Substring Without Repeating Characters

Problem: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.

意思是给定字符串s, 返回最长的没有重复字符的字符串的长度。例如“abcddd”就是“abcd”长度为4,这题我自己试了试发现不是错误就是超时。最终还是不得不参考了其他大神。代码如下:

class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
    int start = 0;
    int max = 0;
    int len = s.length();
    if( len == 0)
        return 0;
    if (len ==1)
        return 1;

    for (int i = 1; i < len; i++)
    {
        for (int j = i - 1; j >= start; j--) // 注意了是 >=  忘记=就错了
        {
            if (s[i] == s[j])
            {
                start = j + 1;
                break;
            }
            else
            {
                if (max < i - j + 1)
                    max = i - j + 1;
            }
        }
    }
    return max;
}
};

如果输入的字符串为空后者为一,可以直接返回长度零或者1。

如果输入的长度大于1,那么我们就可以从下标1个开始(因为下标是从零开始的,所以下标1其实是第二个)

每次都只需要判断当前往回回溯到start点有没有重复字符。注意了这里的start不总是指第一个字符,而是根据相同字符在变。

举个例子吧:abcabcdf

第一次的时候当前的为第二个字符,也就是b,这时前面只有一个a,没有重复,所以记录i-j+1为2到max中,同样c的时候max就是3了,再到第二个a的时候,我们可以注意到现在的最大长度已经在刚才c的时候记录了。这时因为重复了这是第一次发现有重复的字符,所以我们的答案中肯定不可能包含这两个重复字符(因为题目要求就是不重复)。那么由于前面的可能的最大字符已经记录在max了。我们只需把start点定位到第一个重复字符的下一位,此例中是b。

同样在继续当前已经到第二个b了发现重复,再把start点定位到c,继续,当前到第二个c,又重复,则start定位到a,当前点到d,此时i-j+1是4,更新max,最后当前到f,max更新为5

所以此例最终答案为5.就是这样了。

posted on 2014-10-08 23:51  higerzhang  阅读(422)  评论(0编辑  收藏  举报