0.前言
因设置为私密总是找不到,就发出来了,本篇文章只是写给自己的,没有参考意义,请见谅(仅仅加上了自己的一点理解,已注明转载)
最近在做老师布置的算法作业,写动态规划的时候看了一些资料,大部分都是参考资料写的。
所以感觉掌握不牢,于是找了一下leetcode题目,没想到还真做出来了。
1.题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
2.代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
vector<int> f(n,1);
if(n==0) return 0;
int res=1;
int restart;
for(int i=1;i<n;i++){
int flag=1; //1表示没有相同的(注:每次都需要重置)
for(int j=i-1;j>=i-f[i-1];j--){
if(s[j]==s[i]){
restart=j;
flag=0;
break;
}
}
if(flag!=0) f[i]=f[i-1]+1;
else if(flag==0&&restart!=i-1){
for(int j=restart+1;j<i;j++) f[j]-=f[restart];
f[i]=f[i-1]+1;
}
res=max(f[i],res);
}
return res;
}
};