求一个字符串中不含重复字母的最大子串的长度。
【思路】
1.用临时tmp记录长度,遇到重复字母把tmp当前值赋给要返回的length,tmp归零
比较tmp和length,当tmp>length时,更新length。
2.每个字母向前遍历是否有重复字母,用哈希表。
3.反复提交代码不能通过后看了题目tag,知道需要双指针,用一个begin指向重新计数的开始处,i-begin得到当前长度,
每次遇到重复就把begin赋值为哈希表该字母对应的序号的后一个。
注意:哈希表还要更新重复字母的序号,否则每次都和第一次出现过的比,begin赋值不正确。
【my code】
int lengthOfLongestSubstring(string s) { int length=s.size(); int l=0,tmp=0; int begin=0,end=0; unordered_map<char,int> charmap; for(int i=0; i<length; i++){ if(charmap.find(s[i])!=charmap.end()){ if(l<tmp) l=tmp; tmp=i-begin;//eg:ohomm if(begin<charmap[s[i]]+1)//eg:abba begin=charmap[s[i]]+1; } charmap[s[i]]=i; } if(l<tmp) l=tmp; return max(l,length-begin); }
【总结】
一把辛酸泪!
改了无数遍!最后结果还特别差……哭晕。
看到一个新解法,新开一个数组,排名十分靠前,明天细细分析。
【other code】
int lengthOfLongestSubstring(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function memset(canUse, true, sizeof(canUse)); int count = 0; int start = 0; int ret = 0; for(int i = 0; i < s.size(); i++) { if (canUse[s[i]]) { canUse[s[i]] = false; count++; } else { ret = max(ret, count); while(true) { canUse[s[start]] = true; count--; if (s[start] == s[i]) break; start++; } start++; canUse[s[i]] = false; count++; } } ret = max(ret, count); return ret; }
时间: 2024-11-08 15:07:59