题目描述:
给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串
分析:
暴力,遍历寻找和添加方法,将会全部比较。设置一个临时string,表示目前已经的最小字串。从第一个字符开始,外层循环表示第一个字符所构成的字串,内层循环在该第一个字符所构成的字串的所有情况。比如abcabcbb,第一次就是abca,第二次就是bca。。。等等。接下来看
内层循环里面,判断临时string里面(临时字串)是否已经存在要添加的字符。时间复杂度比价高,不过能AC。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = 0;
string next = "";
if(s.size() == 1)
return 1;
if(s.size() == 0)
return 0;
for(int i=0;i<s.size()-1;i++){
string next = "";
next += s[i];
for(int j=i+1;j<s.size();j++){
if(WhetherExistence(next,s[j])) //和下一个字符不想等
{
next += s[j];
if((j==s.size()-1)&& j-i+1>length)
length = j-i+1;
}
else{
if(j-i>length)
length = j-i;
break;
}
}
}
if(length==0)
length = s.size();
// cout<<next<<endl;
return length;
}
int WhetherExistence(string s,char a){
for(int i=0;i<s.size();i++)
{
if(s[i] == a)
return 0;
}
return 1;
}
};
利用map,时间复杂度为O(n)。参考该文的方法:http://www.cnblogs.com/ariel-dreamland/p/8668286.html
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res = 0, left = 0, i = 0, n = s.size();
unordered_map<char, int> m;
for (int i = 0; i < n; ++i) {
left = max(left, m[s[i]]);
m[s[i]] = i + 1;
res = max(res, i - left + 1);
}
return res;
}
};