题意
给定一个字符串,请你找出其中不
含有重复字符的 最长子串 的长度。
题意解读
1.这个子序列所有的元素都是不重复的
2.这个子序列是连续的
样例
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
思路
错误思路
我开始的时候,我想的是标记,没有考虑位置。
标记我感觉能做,但是奈何实际编写能力太差。
我们做算法的目的,不仅仅是为了AC题目的快感(AC是快乐的)。
还有就是在做题过程中的思路,以及做完之后的总结。
我觉得过程对我们的思维训练尤为重要。三个字总结:为什么
正确思路
在思考的过程中,我们要得到发现无重复最长字串,我们不能直接标记,
我们应该想什么时候,记录答案的数值重置。比如yww,当前在第二个位
置,那么当遇到当前的字串出现过,就是该重置的时候,用队列来实现。
我这里不用,直接数组来维护位置之间的关系。
通过下标之间的关系,来确定最长不重复子串。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int vis[256];//这里的意思是标记256个字符。
memset(vis,-1,sizeof vis);//初始值设为-1,为什么不是0.这样设置不需要特判。
int st = -1, res = 0;//
for (int i = 0; i < s.size(); i ++)
{
if (st < vis[s[i]]) st = vis[s[i]];//这里的目的就是更新状态
vis[s[i]] = i;
res = max(res, i - st);//得到答案
}
return res;
}
};
第一次写博客,欢迎指正。