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.
思路
一看这道题,差点被它举得例子给带坏了,以为这个字符串是从第一个字母开始的,就觉得没什么难的嘛,难道又是有什么高端的牛逼的简练的算法?后来与室友讨论了一下,恍然大悟,原来是这个子字符串是可以不同第一个字母开始的(读题很重要啊
),瞬间就觉得貌似不太好做了。可是,高端的室友又提醒了我一下,以前写过一个找回文的题。当时用的是动态规划,也就是后面的计算使用前面的结果,瞬间我就知道怎么写了。今天下午把它写出来了。
![敲打](http://static.blog.csdn.net/xheditor/xheditor_emot/default/knock.gif)
简而言之就是,先看长度为1的子字符串是不是每个字母都不重复,然后看长度为2的,而在看长度为2的时候。这样在看长度为k的子字符串的时候,不要再一个一个的比了看是不是没有重复的字母了,而是结合前面长度为k-1的子字符串,也就是说先看后k-1个字母是不是有重复的字母(这个可以看之前计算过的结果),然后在看第一个字母在是不是在剩下的k-1个字母中出现过。这样就是思路,提交了之后一次性通过。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<bool> status(s.length(),true);
for(int l=1;l<s.length();l++){
bool res=false;
for(int i=0;i+l<s.length();i++){
string tmp=s.substr(i+1,l);
if(status[i+1]){
if(inStr(s[i],tmp))
status[i]=false;
}else{
status[i]=false;
}
res = res || status[i];
}
if(!res) return l;
}
return s.length();
}
bool inStr(char c,string str){
for(int i=0;i<str.length();i++){
if(c==str[i])
return true;
}
return false;
}
};