思路:将源字符串s扫描一遍,找出n个不重复的子字符串,然后返回最长的那个的长度。
复杂度分析:查找子字符串要o(n^2),再乘以o(n)个子字符串,最后复杂度为o(n^3).实际情况可能要好很多,因为查找子字符串是否重复中的n只有少数能接近s.length().该算法的瓶颈在查找子字符串是否重复所花的时间。可以用树存储字符串,复杂度为o(nlogn!).
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
list<string> strList;
string temp;
int maxLength = 1;
for (int i = 0; i < s.length(); ++i)
{
temp = s[i];
int j = i + 1;
while (notInSubstr(temp, s[j]) && j < s.length())
temp += s[j++];
strList.push_back(temp);
}
for (list<string>::iterator it = strList.begin(); it != strList.end(); ++it)
{
if ((*it).length() > maxLength)
maxLength = (*it).length();
}
if (s.length() == 0)
return 0;
return maxLength;
}
bool notInSubstr(const string str, const char ch)
{
for (int i = 0; i < str.length(); ++i)
{
if (str[i] == ch)
return false;
}
return true;
}
};
另外附上热评里九行代码:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}