首页 > 代码库 > LeetCode 第三题,Longest Substring Without Repeating Characters

LeetCode 第三题,Longest Substring Without Repeating Characters

题目:

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.

题意:

就是寻找一个给定字符串中的不重复最长字串的长度。

比如abcdab,最长的串位abcd或cdab,长度位4.

解法:

第一种方法是暴搜,不过显然会超时,所以没有尝试。

第二种方法是暴搜的改良版:

代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s)
    {
		int index = 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>=index; j--)
			{
				if(s[i] == s[j])
				{
					index = j+1;
					break;
				}
				else
				{
					if(max < i-j+1)
					max = i - j +1;
				}
			}
		}
		return max;   
    }
};
即是寻找当前下标到字串start是否有重复字符,重复则将start置为重复下标加一。

第三种方法显然是hash表,用一个hash table保存每个字符上一次出现过的位置。从前往后扫描,假如发现字符上次出现过,就把当前子串的起始位置start移动到上次出现过的位置之后——这是为了保证从start到i的当前子串中没有任何重复字符。同时,由于start移动,当前子串的内容改变,start移动过程中经历的字符都要剔除。

代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int start = 0; // current start point of substring without dup
        int maxlen = 0; // max length of substring found
        int table[256]; // hash table for index of each char appeared
        for (int i = 0;i < 256;i++) table[i] = -1; // if char not present, index is -1
        int len = s.length();
        for (int i = 0;i < len;i++) {
            if (table[s[i]] != -1) {
                while (start <= table[s[i]]) table[s[start++]] = -1;
            }
            if (i - start + 1 > maxlen) maxlen = i - start + 1;
            table[s[i]] = i;
        }
        return maxlen;
    }
};

而第二种方法和第三种方法时间差距如下: