【题目】
给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
【分析】
【动态规划+滑动窗口】
看到字串,子数组问题想什么?
答:
子串最多以0结尾能往前推多远不重复?
子串最多以1结尾能往前推多远不重复?
子串最多以2结尾能往前推多远不重复?
子串最多以i结尾能往前推多远不重复?
答案都求出来,求所有答案中的最大值
i位置往前推多远不重复的
决定因素?
- 当前字符上次的位置
- I-1位置往前推的距离
……abebacdeab……
13 17
- a上次出现的位置13 4
- 当初以16位置结尾,人家推了4个长度 4
因此子串最多以17结尾能往前推4不重复
【代码】
public class Solution {
public int LengthOfLongestSubstring(string s) {
if(s.Length==0)
{
return 0;
}
int[] map=new int[256];
for(int i=0;i<256;i++)
{
map[i]=-1;
}
int N=s.Length;//字符串的长度
int ans=1;
map[s[0]]=0;//从1开始,0位置记在0位置
int pre=1;//上一个位置,往左推了多长,初始值为1
for(int i=1;i<N;i++)//从一位置开始遍历,以此推断往前能推多远
{
//两个因素
//1.上一个此字符出现的位置,用当前下标减去上一个位置下标
int p1=i-map[s[i]];
//2.前一个字符,往前推了多远,用前一个位置推的长度加一
int p2=pre+1;
//两个因素哪个推的远要哪个,记录当前字符推的长度
int cur=Math.Min(p1,p2);
//当前字符推的长度与之前字符推的长度里最大的作比较
ans=Math.Max(ans,cur);
//将当前字符推的长度当作下一轮比较的上一个位置长度
pre=cur;
//记录当前字符的位置 当作之后比较这个字符上次出现在i位置
map[s[i]]=i;
}
return ans;
}
}