無重復字符的最長子串
阿新 • • 發佈:2018-07-15
pan 操作 sta 必須 hash表 浪費 字符串 art int
給定一個字符串,找出不含有重復字符的最長子串的長度。
示例:
給定 "abcabcbb"
,沒有重復字符的最長子串是 "abc"
,那麽長度就是3。
給定 "bbbbb"
,最長的子串就是 "b"
,長度是1。
給定 "pwwkew"
,最長子串是 "wke"
,長度是3。請註意答案必須是一個子串,"pwke"
是 子序列 而不是子串。
老樣子看到字母就想到分箱。。但是分箱需要重置零,而且匹配到重復字符時,必須回溯到前一個重復字符。。需要大量的操作浪費很多時間。
看了別人的解後發現只要加一個start指針就好了。。。。
思路就是碰到一個字符,先看一下hash表中它的上一個位置是否在start之後,是的話說明遇到重復字符了,計算出子串的長度,更新maxlen和start指針。或者碰到‘\0’也要計算len,最後更新一下hash表的數據,即該字符的位置。
int lengthOfLongestSubstring(char* s) { int a[128]={0}; int ptr,pos=1,start=1; int len,maxlen=0; char *p=s; do{ ptr=*p; if(a[ptr]>=start||ptr==0) { len=pos-start; if(len>maxlen) maxlen=len; start=a[ptr]+1; } a[ptr]=pos++; }while(*p++); return maxlen; }
無重復字符的最長子串