输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串
一、解题思路:(蛮力法)
(1)两个for循环,外层循环用来遍历整个数组(变量 r ),内层循环(变量 i )用来遍历子串即 i 与 j 之间的字符串
(3)只要当外层循环的条件不满足时,程序就退出,不论子串中还是否有重复值
(4)用变量 tmp 表示子串之间无重复的最长子序列的长度,tmp = r - i ,l = i +1 ,max表示无重复的最长子序列长度
(5)当每次 i 与 r 对应的字符相等的时候就要比较 tmp 与 max ,找出当前的无重复最长子序列的长度
(6)当 i 与 r 对应的字符相等的时候,接下来就要判断它俩的值是否相等,如果相等就代表目前的子序列中无重复值,tmp++,如果不相等,就说明重复值了,那么此时的 l 也就是 i 的初始位置要向后走一个了,此时字串中的无重复序列的长度tmp = r - i;
class Solution {
public:
int lengthOfLongestSubstring(string s)
{
int max = 0;
int tmp = 0;
int l, r, i;
int N = s.size();
for (l = 0, r = 0; r <= N; r++)
{
for (i = l; i <= r; i++)
{
if (s[i] == s[r])
{
if (tmp > max)
max = tmp;
break;
}
}
if (i == r)
tmp++;
else
{
l = i + 1;tmp = r - i;
}
}
return max;
}
};
int main()
{
Solution s1;
Solution s2 ;
Solution s3 ;
cout<<"length1 = "<<s1.lengthOfLongestSubstring("abcdec")<<endl;
cout<<"length2 = "<<s2.lengthOfLongestSubstring("bbbbbb")<<endl;
cout<<"length3 = "<<s3.lengthOfLongestSubstring("pwwke")<<endl;
return 0;
}
未完,待续