美文网首页
找到字符串中不重复出现字符的最长子串长度

找到字符串中不重复出现字符的最长子串长度

作者: 我是繁星 | 来源:发表于2018-05-04 00:14 被阅读0次

时间负责度最高的写法

int contans(char* s,int begin,int end,char p){
    for (int i=0; i<=end-begin; i++){
        if (s[i+begin] == p){
            return 1;
        }
    }
    return 0;
}
int lengthOfLongestSubstring(char* s) {
    int count = 0;
    if (strlen(s) == 1 ){
        return 1;
    }
    for (int i=0; i<strlen(s); i++){
        for (int j=i+1; j<strlen(s); j++){
            if (contans(s,i,j-1,s[j]) == 1){//判断前面的一段数组中是否包含字符
                if (count < j-i){
                    count = (j-i);
                }
                break;
            }else if (j == strlen(s)-1){//到了最后
                if (count < j-i+1){
                    count = (j-i+1);
                }
            }
        }
    }
    return count;
}

我擦我发现LeetCode都崩了,输入了一个上千行的字符。


image.png

正解如下,创建一个哈希表用于记录字符串中字符的位置,key为字符value为该字符在字符串中的位置。

int lengthOfLongestSubstring(char* s) {
    int begin =0;//记录子串的起始位置
    int end = 0;//记录子串的结束位置
    int i = 0;//记录当前不重复字符串的起点
    int j = 0;//记录当前不重复字符串的终点
    int max = 0;
    int hs[128] = {};
    int k = 0;
    while (k<128){
        hs[k] = -1;
        k++;
    }
    while (i<strlen(s)){
        if (hs[s[i]-0] >= j){//如果字符串出现了对应的位置且大于j,说明有遇到了重复的字符。
            j = hs[s[i]-0] + 1;
        }else{//如果小于等于j,说明是第一次出现,无重复的,
            if (max < i-j+1){
                max = i-j+1;
            }
        }
        hs[s[i]-0] = i;
        i++;
    }
    return max;
}

相关文章

网友评论

      本文标题:找到字符串中不重复出现字符的最长子串长度

      本文链接:https://www.haomeiwen.com/subject/esalrftx.html