leetcode之 Longest Substring Without Repeating Characters

来源:互联网 发布:电脑上电视直播软件 编辑:程序博客网 时间:2024/05/28 11:49

原题如下:

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.

这道题的暴力解法比较简单,可以利用set来保存之前扫描过的没有重复的节点,当遇到重复的节点是让指针回溯到重复节点的下一个节点继续扫描,因为需要回溯,所以在大数组时出现超时。

int lengthOfLongestSubstring(string s) {if(s.size() == 0 || s.size() == 1)return s.size();set<char>st;int maxLen = 0;for(int i = 0; i < s.size(); i++){if(st.find(s[i]) != st.end()){if(st.size() > maxLen)maxLen = st.size();i = i - st.size();st.clear();continue;}st.insert(s[i]);}if(st.size() > maxLen)maxLen = st.size();return maxLen;    }
思路二借鉴了大牛的两篇博客:http://blog.csdn.net/likecool21/article/details/10858799和http://blog.csdn.net/cshaxu/article/details/12433931,其中第一篇中有图示,第二篇中有具体代码,主要思路是这样的:首先创建一个包含256个单元的数组,并设其初值为-1,遍历字符串,以字母的ASCII码为下标,保存字母在字符串中出现的位置,如果以当前字母为下标的数组值不为-1,说明出现重复元素,此时,需将被重复元素所在位置之前的所有元素的下标置-1,同时更改起点位置start为其后的第一个元素。这里边的思路比较容易理解,关键是编程实现时要区分下标和数组值所代表的的意义,我就因为弄混而多次提交出现错误。

int lengthOfLongestSubstring(string s) {if(s.size() <= 1)return s.size();vector<int>v(256,-1);int maxLen = 0;int start = 0;for(int i = 0; i < s.size(); i++){if(v[s[i]] != -1){//出现重复字符,将v[s[i]]之前的全部置-1,同时使start指向重复数字后的第一个字符的下标while(start <= v[s[i]])    v[s[start++]] = -1;}if(i - start + 1 > maxLen )maxLen = i - start + 1;v[s[i]] = i;}return maxLen;}};

在上述思路二的基础上,如第一篇博客中所说的,当发现重复元素时,只需更改start值即可将重复元素之前的元素去除,而不必将重复元素之前的元素下标置-1,在比较是否重复时不是判断其下标是否为-1,而是判断其下标是否大于start值,因为只有在start之后的元素才是当前子串的重复元素,这样的代码更加简洁和高效,与思路二相比省去了将之前的元素置-1的过程,其时间复杂度为O(n)。

int lengthOfLongestSubstring(string s) {if(s.size() <= 1)return s.size();int index[256];for(int i = 0; i < 256; i++){    index[i] = -1;}int start = 0,maxLen = 0;for(int i = 0; i < s.size(); i++){    if(index[s[i]] >= start)start = index[s[i]] + 1;if( i - start + 1 > maxLen)maxLen = i - start + 1;index[s[i]] = i;}return maxLen;}





0 0
原创粉丝点击