给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列,而不是子串。
public int LengthOfLongestSubstring(string s) {
if(s == null || s == "") return 0;//安全检测
int lLength = 0;
int tempLength = 0;
Dictionary<char,int> dic = new Dictionary<char,int>();//记录字串中是否有重复
for(int i = 0;i<s.Length;i++)
{
if(dic.ContainsKey(s[i]))
{
//有重复的情况
if(tempLength > lLength)
{
lLength = tempLength;//赋予新长度
}
tempLength = i - dic[s[i]];//这个是重点,遗弃重复字符及前面的长度
Dictionary<char,int> nDic = new Dictionary<char,int>();
for(int j = dic[s[i]]+1;j<=i;j++)
{
//保留 重复字符间 的字符在字典中
nDic.Add(s[j],j);
}
dic = nDic;
}else{
//无重复,直接加
dic.Add(s[i],i);
tempLength++;
}
}
//一路绿灯无重复的情况
if(tempLength > lLength)
{
lLength = tempLength;
}
return lLength;
}这段代码写了挺快的,因为之前就看过思路,睡觉前也构思过了。但是无可避免的还是要提交很多次才能通过。
哈希字典主要记录当前字串的字符和每个字符的位置,当发现重复的时候,很容易得到两个重复字符的下标,两个下标相减就是遗弃重复字符前面后的字串长度了。
例如:abcabcbb,bcab,两个b为1和4,那么4-1=3,刚好为cab字串的长度3