首页 > 代码库 > 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; } };
而第二种方法和第三种方法时间差距如下:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。