原文地址 沐印 小站https://c.undf.top: "leetcode #3 无重复字符的最长子串" date: 2023-06-08 08:06:00 tags: - 😄leetcode abbrlink: categories: thumbnail: https:// 图片缺失请访问源站 https://c.undf.top/utools/%E6%8C%A3%E9%92%B1%E7%9A%84%E8%BF%9B%E5%BA%A6%E6%9D%A1%EF%BC%8C%E5%BE%97%E6%98%AF%E8%80%81%E6%9D%BF%E7%BB%99%E6%88%91%E7%9A%84%E6%AC%A0%E6%9D%A1%E3%80%82%20%E5%89%AF%E6%9C%AC%20%E5%89%AF%E6%9C%AC_h43yvu37v7fjxdw3.gif imgonly: true
3 无重复字符的最长子串
代码
int lengthOfLongestSubstring(string s)
{
string temp;
int ftemp = 0;
for(int i = s.length(); i > 0; i--)
{
if (temp.find(s[s.length() - i]) > temp.length()) // 无重复 temp.find(s[s.length() - i]) == -1 但会很大 所以
{
// 无重复
temp.push_back(s[s.length() - i]);
ftemp = temp.length() > ftemp ? temp.length() : ftemp;
}
else
{
// 有重复
i += (temp.length() - temp.find(s[s.length() - i]) - 1);
temp.clear();
temp.push_back(s[s.length() - i]);
ftemp = temp.length() > ftemp ? temp.length() : ftemp;
}
}
return ftemp;
}
使用到的函数
string::find(char c) // 返回c在string中的位置 无则返回string::npos
string::length() // 返回string的长度
string::push_back(char c) // 在string的末尾添加c
string::clear() // 清空string
思路
刚开始看错了题
做完去看评论 发现这个题的思路是滑动窗口
这道题主要用到思路是:滑动窗口
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度:O(n)O(n)O(n)
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
c++ 很多特性还不会用 要继续学习