--- tags: Leetcode topic: 3. Longest Substring Without Repeating Characters --- # 3. Longest Substring Without Repeating Characters ## Solution 1 直覺做法 ```c= int check(char * myarray, char c){ int val = (int)c; if(myarray[val]){ return 1;//char existed } else{ return 0;// } } void addfunc(char * myarray, char c){ int val = (int)c; myarray[val]++; } int lengthOfLongestSubstring(char * s){ int s_len = 0,ans = 0, status =0,count = 0, max = 0; int i, j; char* tmp = s; if(!s) return 0; while(*tmp){ s_len++; tmp++; } char* myarray = calloc(1000,sizeof(char)); for(i=0; i<s_len; i++){ for(j=i;j<s_len;j++){ //check first status = check(myarray, s[j]); if(status == 0){ count++; if(max < count){ max = count; } addfunc(myarray, s[j]); } else{ if(max < count){ max = count; } //printf("count = %d\n",count); count = 0; //array reset for(int z =0;z<1000;z++) myarray[z] = 0; } } count =0; for(int z =0;z<1000;z++) myarray[z] = 0; } if(max < count){ max = count; } return max; } ``` 很可惜,超時了 複雜度${O(N^2)}$ ![](https://i.imgur.com/Porvcuo.png) ## Solution 2 Hash table ```c= int lengthOfLongestSubstring(char * s){ if(!s) return 0; int *my_array = malloc(128 * sizeof(int)); int max =0,s_len=0,start = 0; char* tmp = s; while(*tmp){ tmp++; s_len++; } for(int i=0;i<128;i++) my_array[i] = -1; for(int i = 0; i<s_len; i++){// in substring if(my_array[s[i]]>=start){ start = my_array[s[i]]+1; my_array[s[i]] = i; } else{// not in substring my_array[s[i]]=i; max = (max<(i-start+1))?(i-start+1):max; } } return max; } ``` ![](https://i.imgur.com/4Q7ISXO.png)