您的位置:首页 > 编程语言 > C语言/C++

leetcode挨个儿刷150429(5):Longest Substring Without Repeating Characters

2015-04-29 22:27 435 查看
题目内容:

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.

题目说明:

这道题就是求最大无重复字串的。之前看过KMP算法的内容,在做这道题的时候,借鉴了KMP算法中next数组求解的思路。也声明了一个数组,数组的每个元素存储当前字符为结尾的最长无重复字串。

实现过程中,借助了map。并使用了STL库的排序sort。

其中,设字符串长度为n。

因为对于每个字符,均需要map进行一次查找。而对于m个元素,STL中,map的查找复杂度为:log m。

对于查找的复杂度就是:log1+log2+log3+.……+logn,复杂度为:O(log n)

排序的复杂度为O(nlog n)

总的说来,复杂度为:O(nlog n)。

代码如下:

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int sub_length = 0;
int size = s.size();
if(size <= 0)
return sub_length;
char str[size];
strncpy(str,s.c_str(),size);
map<char,int> char_index;
int str_array[size];//记录当前位置的不重复字符串长度
for(int i = 0; i < size;i++)
{
if(i == 0)  //对于第一个元素的处理
{
str_array[i] = 1;
char_index[str[i]] = i;
}
else
{
if(char_index.count(str[i]) == 0)  //尚未出现重复
{
char_index[str[i]] = i;  //更新这个key对应的value值
str_array[i] = str_array[i - 1] + 1;
}
else  //有与当前字符重复的位置
{
int dup_len = i - char_index[str[i]];//和上一个重复位置的距离
char_index[str[i]] = i;//更新这个key对应的value值
int dis_len = str_array[i - 1] + 1;
str_array[i] = dup_len < dis_len ? dup_len : dis_len; //取二者中小的那个
}
}
}
sort(str_array,str_array + size);
sub_length = str_array[size - 1]; //排序来返回最长的长度
return sub_length;
}
};


如果还要精简时间复杂度的话,可以考虑使用unordered_map来替换map。这样,查找的复杂度就是O(1)了。

还可以使用一个最大值标签,一直记录着最大值就好了。最后只需要返回它就好了,不需要排序。那么时间复杂度就是O(n)了。

代码如下:

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int sub_length = 0;
int size = s.size();
if(size <= 0)
return sub_length;
char str[size];
strncpy(str,s.c_str(),size);
unordered_map<char,int> char_index;
int str_array[size];//记录当前位置的不重复字符串长度
for(int i = 0; i < size;i++)
{
if(i == 0)  //对于第一个元素的处理
{
str_array[i] = 1;
char_index[str[i]] = i;
sub_length = 1;
}
else
{
if(char_index.count(str[i]) == 0)  //尚未出现重复
{
char_index[str[i]] = i;  //更新这个key对应的value值
str_array[i] = str_array[i - 1] + 1;
if(sub_length < str_array[i])
{
sub_length = str_array[i];
}
}
else  //有与当前字符重复的位置
{
int dup_len = i - char_index[str[i]];//和上一个重复位置的距离
char_index[str[i]] = i;//更新这个key对应的value值
int dis_len = str_array[i - 1] + 1;
str_array[i] = dup_len < dis_len ? dup_len : dis_len; //取二者中小的那个
if(sub_length < str_array[i])
{
sub_length = str_array[i];
}
}
}
}
return sub_length;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息