题解 | #最小覆盖子串#

最小覆盖子串

http://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param S string字符串 
 * @param T string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* minWindow(char* S, char* T ) {
    int left = 0, right = 0;
    int i = 0, j = 0;
    int S_len = strlen(S);
    int T_len = strlen(T);
    int flag = 0;
    int min_l = 0, min_r = S_len, count = 0;    
    int arr[T_len][2];//记录需要的字符和需要的数量
    int char_need[128];//记录各字符的数量
    int need_count;
    for(i = 0; i < 128; i ++)
    {
        *(char_need + i) = 0;
    }
    for(i = 0, j =0; i < T_len; i ++)
    {
        if(*(char_need + (*(T + i))) == 0)
        {
            *(*(arr + (j ++))) = *(T + i);
        }
        *(char_need + (*(T + i))) += 1;
    } 
    for(i = 0; i < j; i ++)
    {
        *(*(arr + i) + 1) = *(char_need + (*(*(arr + i))));
        *(char_need + (*(*(arr + i)))) = 0;

    }
    need_count = j;
    while(left < S_len)
    {
        flag = 0;
        //求出right位置
        while(!flag && right < S_len) 
        {
            *(char_need + (*(S + right))) += 1;
            flag = 1;
            for(i = 0; i < need_count; i ++)
            {
                if(*(char_need + (*(*(arr + i)))) <  *(*(arr + i) + 1))
                {
                    flag = 0;
                }
            }
            if(flag) 
            {
                count ++;
                break;
            }
            right ++;
        }
        //处理left
        if(!flag) break;
        flag = 1;
        while(flag && left < right) 
        {
            *(char_need + (*(S + left))) -= 1;
            flag = 1;
            for(i = 0; i < need_count; i ++)
            {
                if(*(char_need + (*(*(arr + i)))) <  *(*(arr + i) + 1))
                {
                    flag = 0;
                }
            }
            if(!flag) 
            {
                break;
            }
            left ++;
        }
        if(right - left < min_r - min_l)
        {
            min_l = left ;
            min_r = right ;
        } 
        left ++;
        right ++;
    }
    if(count)
    {
        char *ans = (char *)malloc(sizeof(char)*(min_r - min_l + 2));
        for(i = min_l, j = 0; i <= min_r; i ++, j ++)
        {
            *(ans + j) = *(S + i);
        }
         *(ans + j) = '\0';
        return ans;
    }
    else
    {
        return "";
    }
}

全部评论

相关推荐

见见123:简历没有啥问题,是这个社会有问题。因为你刚毕业,没有工作经历,现在企业都不要没有工作经历的。社会病了。
点赞 评论 收藏
分享
牛客84809583...:举报了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务