意思是求出一个给定字符串中的最长子串的长度,子串里边不能有相同字符。
这个题事先没有看Resolution,所以解得比较粗糙。 不过跑出来结果还可以。
跑出结果之后,看了下Resolution的参考算法,然后看了下最小时间10ms那位大神的实现。关键点是需要用hash表来存储一遍数组下标,即把两个嵌套的循环分别处理为两个连续的循环,使O(n^2)变成O(n),跟第一题addTwo差不多做法。 下边贴下我的实现,最优的算法请自行去LeetCode查看。
int lengthOfLongestSubstring(char* s) {
if(s == NULL || strlen(s) == 0)
return 0;
char* p = s;
int len = strlen(s) + 1;
char* subString = (char*)malloc(len * sizeof(char));
memset(subString,0,len);
// [a , b ,c , d ,v , d ,x , y ,d ,z]
// | | |
//first cur end
int pFirstIndex = 0; //找到一个相同字符时,要求的curIndex那个字符的长度,是前边加后边
int pCurIndex = 0; //p移动到了多少位置
int pEndIndex = 0;//第二个找到的字符的位置
int i = 0; //子字符串下标
int max = 0;//找到的重复的字符串的长度,作为返回值
while(pEndIndex < len-1){//遍历数组
for(int j= pFirstIndex; j < i; j++){
if(subString[j] == p[pEndIndex]){
//if(pFirstIndex == 0)
pCurIndex = j;
//printf("f=%d,c=%d,e=%d\n",pFirstIndex,pCurIndex,pEndIndex);
if((pCurIndex - pFirstIndex) + (pEndIndex - pCurIndex) > max)
max = (pCurIndex - pFirstIndex) + (pEndIndex - pCurIndex);
pFirstIndex = pCurIndex + 1;
//printf("get max = %d,f=%d\n",max,pFirstIndex);
}
}
subString[i++] = p[pEndIndex++];
}
//printf("e=%d,f=%d\n",pEndIndex,pFirstIndex);
if((pEndIndex - pFirstIndex) > max){
max = (pEndIndex - pFirstIndex); //最后那一段的数据的长度,因没有找到一个一样的,所以是直接就是那个长度
//printf("max2 = %d\n",max);
}
return max;
}