给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "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