leetcode 之无重复字符的最长子串

前言

今天leecode上看到一个题目,分享给大家,我也给出了解答,大家可以参考下,这种解法还可以进行优化,比如采用哈希算法代替比较。

leetcode 之无重复字符的最长子串

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。

答案解答

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


int lengthOfLongestSubstring(char *s) {
    int len = strlen(s);
    char *t = s, *p_start = s, *temp;
    int max_len = 0;
    int t_len = 0;
    char c;
    while (t < (s + len)) {
        if (t == s) {
            ++t;
            ++t_len;
            continue;
        }

        c = *t;
        temp = t;
        while (--temp >= p_start && *temp != c);
        if (temp >= p_start) {
            p_start = temp + 1;
            if (t_len > max_len) {
                max_len = t_len;
            }
            t_len = t - p_start+1;
            t++;
        } else {
            ++t_len;
            ++t;
        }
    }
    if (t_len > max_len) {
        max_len = t_len;
    }
    return max_len;
}

int main() {
    char *input = "hello";
    printf("%d\n", lengthOfLongestSubstring(input));
    return 0;
}

本作品采用《CC 协议》,转载必须注明作者和本文链接
微信:okayGoHome
Dennis_Ritchie
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
wanghan

char *t的*是地址的意思吗

3年前 评论
/**
  * @param String $s
  * @return Integer
  */
function lengthOfLongestSubstring($s) {
    $left = 0;
    $right = 0;
    $res = 0;
    while ($right < strlen($s)) {
        // $c 是将移入窗口的字符
        $c = $s[$right];
        // 右移窗口
        $right++;
        // 进行窗口内数据的一系列更新
        $window[$c] = isset($window[$c]) ? $window[$c] + 1 : 1;

        // 判断左侧窗口是否要收缩
        while ($window[$c] > 1) {
            // d 是将移出窗口的字符
            $d = $s[$left] ?? '';
            // 左移窗口
            $left++;
            // 进行窗口内数据的一系列更新
            $window[$d]--;
        }

        $res = max($res, $right - $left);
    }

    // 返回最小覆盖子串
    return $res;
}

return lengthOfLongestSubstring($s = "abcabcbb");  // output: 3

PHP 版的滑动窗口实现

3年前 评论
function lols($s)
    {
        $len = strlen($s);
        $result = 0;
        $start = 0;
        $i = 0;
        while($i<$len){
            $found = strpos($s, $s[$i], $start);

            if($found < $i){
                $start = $found+1;
            }
            if(($i-$start+1)>$result){
                $result = $i-$start+1;
            }
            $i++;
        }
        return $result;
    }

我也来一个

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!