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

时间负责度最高的写法

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近加入了两个读书群一个写作群,发现自己真的差了太多。太过自我的活在自己的世界里,没有见识过真正优秀的人。而这些并...
    梓梦柔阅读 694评论 0 0
  • 不就是没看上吗,从未热恋却感觉跟失恋了一样,食之无味,弃之可惜,吃也吃不进,睡也睡不着...
    Super胡小小阅读 1,111评论 0 0
  • 在我学习运营的这段时间里,被无数的信息包围着,以至于差点淹没在信息的海洋里不能自拔. 昨天看了”还不懂用户运营?看...
    阿MI阅读 1,677评论 0 0
  • 凄凄廊桥谁与伴?倚青丘。 冷波起,斜阳照心忧。 欲写两眉愁,休休。 黑烟笼翠黛。莫登楼。
    十七要加油呀阅读 1,280评论 0 0