原题目:
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the
answer must be a substring, “pwke” is a subsequence and not a substring.
题目大意如下:
给你一个字符串,找到没有重复字符的最长子串。
解题思路:
从首字符开始,遍历整个字符串,找到所有没有重复字符的的子串,将它们的长度加以比较得到最大的。如果仅仅这样做,时间复杂度为O(n³),所以需要优化。
我们看这样一个字符串:dedvabc
第一次循环找到字符串“de”,长度为2,记录下来,目前最长长度为2。
第二次循环找到字符串“dvabc”,长度为5,记录下来,目前最长长度为5。
到这里为止,就可以得出答案了,因为后面不管怎么找是找不到比5大的长度的,因为第二次循环已经遍历了剩下的整个字符串。现在只需输出目前最大长度就可以了。
这样一来时间复杂度就变成了O(n²)。
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
string newStr ;
int max = 0 , i = 0 ;
while(i < s.size()){ //外循环
for(int j = i ; j < s.size() ; ++j){ //内循环
//如果没有重复的字符,拿出来构成新的子串
if(newStr.find(s[j]) == -1) newStr.push_back(s[j]) ;
else{ //找到重复的,记录下当前最长长度并清空子串
if(max < newStr.size()) max = newStr.size() ;
newStr.clear() ;
i++ ;
break ;
}
}
//若有一次遍历剩下的字符串,只需要比较这个字符串的长度和当前最长长度
if(max < newStr.size()) return newStr.size() ;
}
return max ;
}
};
运行结果:
知识补充:
string中的npos是一个很大的数,当作为返回值的时候它的值为-1,作为表示长度的时候它表示直到string的结束(until the end of the string)。