Longest Substring Without Repeating Characters

来源:互联网 发布:中国人没有信仰 知乎 编辑:程序博客网 时间:2024/06/06 01:58

题目:求字符串最大不重复子串的长度。

方法1:动态规划

       遍历字符串到下标 i i时,若 s[i] 在以下标 i - 1 的不重复子串中重复出现,则找到其位置 j ,当前不重复子串的长度dp为 i - j 。若没有重复出现,则当前不重复子串长度为上一个不重复子串长度加1。

int lengthOfLongestSubstring(string s){int dp = 1;           /*不重复子串的长度*/int last_start = 0;   /*不重复子串的起始位置*/int maxLen = 0;               if(s.size() == 1)     /*字符串只有一个字符的情况*/    {    return dp;    }for(int i = 1; i < s.size(); i++)   {for(int j = i - 1; j >= last_start; j--){if(s[i] == s[j])   /*字符重复出现*/{dp = i - j;last_start = j + 1;break;}else if(j == last_start)  /*从start到i-1无重复字符*/{dp++;}}if(dp > maxLen){maxLen = dp;}}return maxLen;}


方法2:动态规划+hash

        用哈希表保存每个字符 s[i] 在字符串中的最新位置(即i最大处),从而不需要利用循环往回寻找 s[i] 是否重复出现。

int lengthOfLongestSubstring(string s){int maxLen = 0;int curLen = 1;                    /*保存当前不重复子串的长度*/int visit[256];                    /*保存每个字符的位置*/memset(visit, -1, sizeof(visit));  /*visit初始化为-1*/       visit[s[0]] = 0;    int last_start = 0;                /*保存不重复子串的起始位置*/    if(s.size() == 1)                  /*字符串只有一个字符的情况*/    {        return curLen;    }for(int i = 1; i < s.size(); i++){if(last_start <= visit[s[i]])      /*当前字符s[i]重复出现,且在上一个不重复子串范围内*/{curLen = i - visit[s[i]];last_start = visit[s[i]] + 1;  /*更新不重复子串的起始位置和当前字符的位置*/visit[s[i]] = i;}else{curLen++;visit[s[i]] = i;}if(curLen > maxLen){maxLen = curLen;}}return maxLen;}


 

 

0 0
原创粉丝点击