牛客NC170 最长不含重复字符的子字符串【高频 中等 map、滑动窗口 Java,Go,PHP】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7

思路

    用一个hashmap记录每个字母的index
    如果这个字母已经在map里了
    说明已经有重复了
    这样就更新看这个字母上次出现的index

    需要注意的是这种情况:“bacbca”
    这里的a上次出现的index比c上次出现的index早
    如果按a上次出现的index字符串就变成: cbca
    这就有重复的
    所以: i = max(i, preIndex(a))
    这样就能保证是不重复的字符串

    重点:以每个位置i结尾往左推推多远,下面2个之一:
    i位置当前字符上次的位置能推多远p1
    i-1位置往左推的距离 p2

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int lengthOfLongestSubstring (String s) {
        /*
          用一个hashmap记录每个字母的index
          如果这个字母已经在map里了
          说明已经有重复了
          这样就更新看这个字母上次出现的index

          需要注意的是这种情况:“bacbca”
          这里的a上次出现的index比c上次出现的index早
          如果按a上次出现的index字符串就变成: cbca
          这就有重复的
          所以: i = max(i, preIndex(a))
          这样就能保证是不重复的字符串

          以每个位置i结尾往左推推多远,下面2个之一:
          i位置当前字符上次的位置能推多远p1
          i-1位置往左推的距离 p2
           */


        if (s == null || s.length() == 0) return 0;

        int[] map = new int[256];
        for (int i = 1; i < 256 ; i++) {
            map[i] = -1;
        }

        int ans = 1;
        int pre = 1; //上一个位置,向左推了多长
        map[s.charAt(0)] = 0;
        for (int i = 1; i < s.length() ; i++) {
            int p1 = i - map[s.charAt(i)];
            int p2 =  pre + 1;
            int cur = Math.min(p1, p2);
            ans = Math.max(ans, cur);
            pre = cur;

            map[s.charAt(i)] = i;
        }

        return ans;
    }
}

参考答案Go

package main


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return int整型
 */
func lengthOfLongestSubstring(s string) int {
	/*
	   用一个hashmap记录每个字母的index
	   如果这个字母已经在map里了
	   说明已经有重复了
	   这样就更新看这个字母上次出现的index

	   需要注意的是这种情况:“bacbca”
	   这里的a上次出现的index比c上次出现的index早
	   如果按a上次出现的index字符串就变成: cbca
	   这就有重复的
	   所以: i = max(i, preIndex(a))
	   这样就能保证是不重复的字符串

	   以每个位置i结尾往左推推多远,下面2个之一:
	   i位置当前字符上次的位置能推多远p1
	   i-1位置往左推的距离 p2
	*/

	if len(s) == 0 {
		return 0
	}

	m := [256]int{}
	for i := 1; i < 256; i++ {
		m[i-1] = -1
	}

	res := 1
	pre := 1 //i-1位置能往左推多远
	m[s[0]] = 0
	for i := 1; i < len(s); i++ {
		p1 := i - m[s[i]]
		p2 := pre + 1
		cur := p1
		if cur > p2 {
			cur = p2
		}

		if cur > res {
			res = cur
		}

		pre = cur
		m[s[i]] = i
	}
	return res
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return int整型
 */
function lengthOfLongestSubstring( $s )
{	/*
    用一个hashmap记录每个字母的index
    如果这个字母已经在map里了
    说明已经有重复了
    这样就更新看这个字母上次出现的index

    需要注意的是这种情况:“bacbca”
    这里的a上次出现的index比c上次出现的index早
    如果按a上次出现的index字符串就变成: cbca
    这就有重复的
    所以: i = max(i, preIndex(a))
    这样就能保证是不重复的字符串

    以每个位置i结尾往左推推多远,下面2个之一:
    i位置当前字符上次的位置能推多远p1
    i-1位置往左推的距离 p2
 */

    if($s ==null || strlen($s) ==0)
        return 0;

    $map =array();
    for($i=0;$i<strlen($s);$i++){
        if(!isset($map[$s[$i]]))
            $map[$s[$i]] =-1;
    }

    $res = 1;
    $pre =1;// i-1位置能往左推多远
    $map[$s[0]] =0;
    for($i=1;$i<strlen($s);$i++){
        $p1 = $i-$map[$s[$i]];
        $p2 = $pre+1;
        $cur =$p1;
        if($cur > $p2)
            $cur =$p2;

        if($res < $cur){
            $res = $cur;
        }

        $pre =$cur;
        $map[$s[$i]] =$i;
    }
    return $res;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识kafka-数据存储篇1

目录 背景 1 kafka总体体系结构 2 疑问解答 2.1 高吞吐低延迟 2.2 实现分布式存储和数据读取 2.3 如何保证数据不丢失 背景 最近在和产品过项目审批的时候&#xff0c;深刻感受到业务方对系统的时时响应提出了更高的要求。目前手上大部分的业务都是基础定时任务去实现的&…

【yolo算法水果新鲜程度检测】

Yolo&#xff08;You Only Look Once&#xff09;系列算法是一类流行的一阶段实时目标检测模型&#xff0c;在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐&#xff0c;可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

家乡特色推荐系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

【Linux】线程互斥{线程间的互斥相关背景概念/锁的相关问题/锁的原理/可重入VS线程安全}

文章目录 0.计算机如何完成y a * b c &#xff1f;1.线程间的互斥相关背景概念2.pthread_mutex_t3.pthread_mutex_lock()4.time() or gettimeofday5.锁的相关问题6.锁的原理7.可重入VS线程安全8.完善后的代码 0.计算机如何完成y a * b c &#xff1f; 来源&#xff1a; 王道…

nodejs+vue反诈科普平台的设计与实现pythonflask-django-php

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低反诈科普平台的运营人员成本&#xff0c;实现了反诈科普平台的标准化、制度化、程序化的管理&#xff0c;有效地防止了反诈科普平台的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串.数值.甚至json…

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透&#xff0c;部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射&#xff0c;添加映射&#xff0c;注册域名前缀3、选择网站应用4、配置你想要代理项…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 &#xff08;一&#xff09;存储引擎概念 &#xff08;二&#xff09;MySQL常用的存储引擎 &#xff08;三&#xff09;存储引擎运作方式 二 MyISAM 存储引擎介绍 &#xff08;一&#xff09; MyISAM 存储引擎特点 1&#xff0c;不支持…

栅格地图路径规划:基于螳螂搜索算法(Mantis Search Algorithm,MSA)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构&#xff0c;分别是 Series&#xff08;一维数组结构&#xff09;与 DataFrame&#xff08;二维数组结构&#xff09;&#xff0c;极大地增强的了 …

个人博客系列-后端项目-系统角色配置(8)

系统角色配置需要设置的接口 用户可以绑定多个角色&#xff0c;角色对应有多个路由权限。用户绑定角色后&#xff0c;可以访问当前角色下的各个api路由和菜单路由。 用户注册时设置用户角色修改用户角色&#xff08;同时对应用户可以访问的路由将会同步变更&#xff09;添加修…

有关AI的随笔(1)

随笔&#xff1a; 今天是周天&#xff0c;是个好日子&#xff0c;结果老师布置的诗还没写&#xff0c;只好去借助AI&#xff0c;结果我发现了几个有趣的问题&#xff1a; 1. AI写的诗是如何来的&#xff1f;通过数据库&#xff1f; 2. 它真的明白是什么意思吗&#xff1f;&…

AutoDL算力云进行yolov5训练流程

目录 第一步 充值第二步 选择我们用到的显卡第三步 将我们的yolov5源代码导入服务器第四步 激活环境第五步 训练第六步 训练完成 提取 第一步 充值 打开我们的算力云官网 然后找到充值入口 最低充值50 第二步 选择我们用到的显卡 一般呢我都用便宜的2080ti 选择2080ti之后 基…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…

【jvm】ParNew和ParallelOld为什么不能一起使用

java垃圾回收器ParNew和ParallelOld为什么不能一起使用 Java垃圾回收器中的ParNew和ParallelOld不能一起使用的原因在于它们的设计和目标不同&#xff0c;以及它们所属的垃圾回收器系列不同。 设计和目标差异&#xff1a; ParNew 收集器是 Serial 收集器的并行版本&#xff0c…

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

Python入门(六)

参数传递 1.普通传参 通过判断对应位置来传递。 2.关键字传参 用关键字(Keyword&#xff09;的方式来传递参数。在定义函数时&#xff0c;我们给了形参一个符号标记&#xff0c;即参数名。关键字传递是根据参数名来让数据与符号对应上。因此&#xff0c;如果在调用时使用关键…

Vite+Vue3+TS+Vue-Router+Axios+Pinia开发模板

一、模板介绍 VUE3开发全家桶模板&#xff0c;安装了ts,router,axios,pinia并提供了简单示例并提供了它们的官网链接。 对axios进行了简单封装。 二、下载地址 https://github.com/yigedayouzi/ViteTemplateOne 三、快速开始 1、git clone gitgithub.com:yigedayouzi/Vite…

鸿蒙实战开发:【7日天气预报】

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是[和风&#xff08;天气预报&#xff09;]&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功…

IDEA, Pycharm, Goland控制台乱码

IDEA, Pycharm, Goland控制台乱码 问题描述: 控制台出现&#xfffd;&#xfffd;&#xfffd;&#xfffd;等乱码 复现频率: 总是 解决方案: 以IDEA为例 添加 -Dfile.encodingUTF-8位置 idea64.exe.vmoptions 在安装idea的bin目录idea.vmoptions idea客户端 示意图