双指针解法,用左边的substr去找右边的substr,如果没找到,右指针往右移,cnt++,更新ans,更新左边的substr;如果找到了,左指针往右移,更新ans,cnt--,更新左边的substr。直到右指针越界。
cpp的2个技术点:
s1.find(s2),返回第一个找到s2的位置,否则返回-1。
s.substr(index,len),截取s串中从index位置起的len个数。
/*
* @lc app=leetcode.cn id=3 lang=cpp
*
* [3] 无重复字符的最长子串
*/
// @lc code=start
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int slen = s.length();
int ans = 0;
if (slen == 0) return ans;
int lp = 0, rp = 0;
ans += 1; // 从index=0开始
string st = s.substr(lp, 1);
cout << st;
int cnt = 1;
rp += 1; // rp指向1
while (rp<slen)
{
int pos = st.find(s.substr(rp, 1));
if (pos != -1) {
// 找到一个,左指针右移,更新st
lp += 1;
st = s.substr(lp, cnt-1);
if (cnt > ans) ans = cnt;
cnt -= 1; // cnt初始化
}
else {
// 没有找到,rp右移
cnt += 1;
rp += 1;
st = s.substr(lp, cnt);
if (cnt > ans) ans = cnt;
}
}
return ans;
}
};
// @lc code=end