3. Longest Substring Without Repeating Characters

来源:互联网 发布:windows api 打开文件 编辑:程序博客网 时间:2024/06/05 06:50

3. 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.

Subscribe to see which companies asked this question

方法1:

class Solution {public:    int lengthOfLongestSubstring(string s) {        if(s.length()==0)            return 0;        if(s.length()==1)            return 1;        string substring="";        substring+=s[0];        int length=0;        for(int i=1;i<s.length();i++)        {            if(substring.find_first_of(s[i])==-1)                substring+=s[i];            else            {                if(substring.length()>length)                    length=substring.length();                int index=s.find_first_of(s[i]);                s=s.substr(index+1);                substring="";                substring+=s[0];                i=0;            }        }        return (length>substring.length())?length:substring.length();    }};

ps:

string substring=""+s[0];//这样写,结果总是出现异常,不知道为什么,先mark一下吧。

对于方法1是一种比较直观的方法,就是从前往后遍历,利用string类里的find_first_of函数来判断某个字符是否出现,没有出现就将该字符添加到子字符串中去;如果已经出现,则应该从重复出现字符第一次出现的下一位开始遍历,这句话蛮拗口的,举例来说:比如待查询字符串abcdcegh,这个字符串的最长没重复元素的子字符串应该是dcegh,长度为5.当我们从前往后遍历时,第一次出现重复字符串的字符是位置4处的c,当我们发现重复字符c后,统计当前子字符串的长度并更新length,然后开始下一次的遍历查询,但是此时我们只需要从原字符串的位置3处(也就是重复字符c第一次出现的位置2的下一个位置)开始遍历搜索就行。分析一下时间复杂度,遍历搜索时间复杂度O(n),然后查询是否存在利用的是string类的find_first_of,该复杂度我找了半天木有找到,反正至少不可能是O(1),假定为O(m),则整个算法的时间复杂度是O(m*n)。

方法2:

class Solution {public:    int lengthOfLongestSubstring(string s) {          int n = s.length();          int i = 0, j = 0; //i是候选字符串的起点, j是候选字符串的终点。          int max_length = 0;          int cur_length = 0;          bool exist[256] = { false };          while (j < n) {              if (!exist[s[j]]) {                  exist[s[j]] = true;  //遍历过,记录为true                  j++;                cur_length=j-i;            } else {                  cur_length=j-i;                max_length = max_length > cur_length ? max_length : cur_length;                 while(s[i]!= s[j]) {                      exist[s[i]] = false;                       //新候选字串从第一个重复字符(当s[i] == s[j]时候的i)的后一位开始算,之前的i不算,等效于没有被扫描到,所以设为false.                      i++;                  }                  i++;                  j++;              }          }          return max_length > cur_length ? max_length : cur_length;      }  };

方法2:整个方法的思路大体和方法1相同,只是,在判断某个字符是否出现时,利用的是哈希表。所以时间复杂度由遍历时间O(n)和判断某个字符是否存在O(1)组成,这里需要提醒的是,遍历的时候,我们需要遍历两个指针,一个是子字符串的起始指针一个是终止指针,但是O(n)+O(n)=O(n)。

0 0
原创粉丝点击