问题描述
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.
分析
寻找没有重复字符的最长子串。基本思路是从第一个字符s[0]开始找,将遇到的所有与前面都不重复的字符存放到一个临时的子串temp_string中,直到遇到一个与temp_string中某个字符相同的字符为止,将当前的temp_string与存储的最大字符串进行比较,如果比之长,则替换,没有则丢弃。之后将把i的值更新为上面temp_string中找到的那个重复的字符在源字符串中的位置-1。再继续进行迭代寻找,直到遍历到字符串的最有一位。这样在最长字符串中存储的字符串就是最长字符串,其长度就是最长字符串的长度。
代码
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
int max_length = 0;
string max_substring;
string temp_max_substring;
for (int i = 0; i < s.length(); i++)
{
for (int j = i; j < s.length(); j++)
{
// 如果存储的字串里面已经有这个字符了,则将目前存储的字串与最长子串进行比较,存储最长者.然后再从i+1继续查找
size_t position = temp_max_substring.find(s[j]);
if (position != string::npos )
{
// 如果当前存储的长度比之前的最大长度大,则替换之
if (max_length < temp_max_substring.length() )
{
max_substring = temp_max_substring;
max_length = temp_max_substring.length();
}
i = int(position);
temp_max_substring = "";
break;
}
else // 如果没有,则将其加入map,并更新临时最长子串
{
temp_max_substring += s[j];
}
}
}
if (max_length < temp_max_substring.length())
{
max_substring = temp_max_substring;
max_length = temp_max_substring.length();
}
return max_length;
}
};