题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
- 输入: “abcabcbb”
- 输出: 3
- 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
- 输入: “bbbbb”
- 输出: 1
- 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
- 输入: “pwwkew”
- 输出: 3
- 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题思路:
使用双指针,前一个指针i每往前走一步,指针j都会检查指针i此时对应的字符在i已走过的子串中是否存在。
代码详解:
#include<iostream>
#include<string>
using namespace std;
int lengthOfLongestSubstring(string s)
{
int len = s.size();
int sum = 0; //最长子串的长度
int num = 0; //中间变量
int j = 0; //查找指针
for (int i = 0; i < len; i++) //i为前进指针
{
for (j = num; j < i; j++)
{
if (s[j] == s[i]) //说明有重复字符
{
num = j + 1; //将此重复字符的为止保存下来
break;
}
}
if (i - num + 1 > sum) //判断原有的子串长度是否大于新子串的长度
{
sum = i - num + 1;
}
}
return sum;
}
int main()
{
string s;
cin >> s;
cout << lengthOfLongestSubstring(s) << endl;
return 0;
}