1 /*
2 * Use two points, pBeg and pEnd, pointing to the begin and end
3 * of current substring without repeating respectively. Integer
4 * Array pos[256] records the last occurrence position of each
5 * ASCII character.
6 *
7 * For each loop, pEnd moved forward one character. If the new
8 * character(i.e. str[pEnd], referred as newChar) has appeared
9 * in current substring before, move pBeg to pos[newChar]+1,
10 * and update pos[], len, etc.
11 *
12 * @author: HZT
13 * @date: 2013-3-7
14 *
15 */
16
17 #include <iostream>
18 #include <memory>
19 #include <cstring>
20 using namespace std;
21
22 int substring(string str){
23 int strLen = str.length();
24 if(strLen == 0) return 0;
25
26 int maxLen = 1;
27
28 int len = 1;
29 int beg = 0, end = 0;
30
31 int pos[256];
32 memset(pos, -1, sizeof(pos));
33 pos[str[0]-'\0'] = 0;
34
35 while(true){
36 end++;
37 if(end >= strLen) break;
38
39 int lastPos = pos[str[end]-'\0'];
40 if(lastPos == -1){
41 len++;
42 lastPos = end;
43 pos[str[end]-'\0'] = end;
44 }
45 else{
46 len -= (lastPos - beg);
47 for(int i=beg; i<=lastPos; i++){
48 if(pos[str[i]-'\0'] == i)
49 pos[str[i]-'\0'] = -1;
50 }
51 pos[str[end]-'\0'] = end;
52 beg = lastPos + 1;
53 }
54
55 if(len > maxLen){
56 maxLen = len;
57 }
58 }
59
60 return maxLen;
61 }
62
63
64 int main(){
65 string str = "bbbbb";
66
67 cout << substring(str) << endl;
68
69 return 0;
70 }