牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目

在这里插入图片描述

题目链接:
https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd

思路

哈希统计每个字符出现的次数。没在窗口内的字符要删除

参考答案C++

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param k int整型
     * @return int整型
     */
    int numKLenSubstrRepeats(string s, int k) {
        //哈希统计
        int n = s.size();
        map<int, int> mymap;
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            int x = s[i];

            // 在map中查找元素
            auto it = mymap.find(x);
            if (it != mymap.end()) {
                int t = it->second;
                mymap.erase(x); //更新值,先删除原来的key
                mymap.insert(pair<int, int>(x, t + 1)); //往map中新增k,v
            } else {
                mymap.insert(pair<int, int>(x, 1)); //往map中新增k,v
            }


            if (i >= k - 1) {
                if (i >= k) { //要移除左边的过期的窗口
                    int delk = s[i - k];
                    auto it = mymap.find(delk);
                    int tmp = it->second;
                    mymap.erase(delk); //更新值,先删除原来的key
                    mymap.insert(pair<int, int>(delk, tmp - 1)); //往map中新增k,v
                    it = mymap.find(delk);
                    if (it->second == 0) {
                        mymap.erase(it); //map中删除key
                    }
                }


                if (mymap.size() < k) { //map的大小
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param k int整型
     * @return int整型
     */
    public int numKLenSubstrRepeats (String s, int k) {
           //哈希来统计
            Map<Character,Integer> map = new HashMap<>();
            int n = s.length();
            int cnt=0;
            for (int i = 0; i <n ; i++) {
                char c = s.charAt(i);

                if(map.containsKey(c)){
                    map.put(c,map.get(c)+1);
                }else{
                    map.put(c,1);
                }

                 if(i>=k-1){
                    if(i>=k){ //需要删除左边窗口外的
                        char delchar = s.charAt(i-k);
                        map.put(delchar,map.get(delchar)-1);
                        if(map.get(delchar) ==0){
                            map.remove(delchar);
                        }
                    }

                    if(map.size()<k){
                        cnt++;
                    }
                }


            }

            return cnt;
    }
}

参考答案Go

package main


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @param k int整型
 * @return int整型
 */
func numKLenSubstrRepeats(s string, k int) int {
	//哈希来统计
	n := len(s)
	cnt := 0
	map1 := map[byte]int{}
	for i := 0; i < n; i++ {
		char := s[i]
		_, ok := map1[char]
		if !ok {
			map1[char] = 1
		} else {
			map1[char] += 1
		}

		if i >= k-1 {
			if i >= k { //需要移除左边过期的窗口
				chardel := s[i-k]
				map1[chardel] -= 1
				if map1[chardel] == 0 {
					delete(map1, chardel)
				}
			}

			if len(map1) < k {
				cnt++
			}
		}
	}
	return cnt
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @param k int整型 
 * @return int整型
 */
function numKLenSubstrRepeats( $s ,  $k )
{
   //哈希来统计
    $cnt = 0;
    $map = [];
    $n = strlen($s);
    for($i=0;$i<$n;$i++){
        $c = $s[$i];

        if(!isset($map[$c])){
            $map[$c] =1;
        }else{
            $map[$c]+=1;
        }

        if($i>=$k-1){

            if($i>=$k){
                $delkey = $s[$i-$k];
                $map[$delkey]-=1;
                if($map[$delkey] ==0){
                    unset($map[$delkey]);
                }
            }
            if(count($map) <$k){
                $cnt++;
            }
        }
    }
    return $cnt;
}

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

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

相关文章

python(一)

一、字面量 字面量:在代码中&#xff0c;被写下来的固定的值&#xff0c;称之为字面量。 Python中常用的有6种值(数据)的类型&#xff1a; 二、注释 注释的分类: 单行注释&#xff1a;以#开头&#xff0c;#右边的所有文字当作说明&#xff0c;而不是真正要执行的程序&#…

2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法爱情进化算法&#xff08;LEA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂环…

多模态模型

转换器成功作为构建语言模型的一种方法&#xff0c;促使 AI 研究人员考虑同样的方法是否对图像数据也有效。 研究结果是开发多模态模型&#xff0c;其中模型使用大量带有描述文字的图像进行训练&#xff0c;没有固定的标签。 图像编码器基于像素值从图像中提取特征&#xff0c;…

C++笔记:类和对象(一)->封装

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量&#xff0c;类型就像是定义了数据的规则&#xff0c;而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型&#xff0c;而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

vue2知识点————(父子通信)

vue2的知识点&#xff0c;更多前端知识在主页&#xff0c;还有其他知识会持续更新 vue组件 在Vue.js 2.x中&#xff0c;父子组件之间的通信是非常常见的情况&#xff0c;Vue提供了多种方法来实现这种通信。 Props 父向子通信 Props 是父组件向子组件传递数据的一种方式。通过…

Java的八大基本数据类型和 println 的介绍

前言 如果你有C语言的基础&#xff0c;这部分内容就会很简单&#xff0c;但是会有所不同~~ 这是我将要提到的八大基本数据类型&#xff1a; 注意&#xff0c;Java的数据类型是有符号的&#xff01;&#xff01;&#xff01;和C语言不同&#xff0c;Java不存在无符号的数据。 整…

【电控笔记5.8】数字滤波器设计流程频域特性

数字滤波器设计流程&频域特性 2HZ : w=2pi2=12.56 wc=2*pi*5; Ts=0.001; tf_lpf =

【行为型模式】解释器模式

一、解释器模式概述 解释器模式定义&#xff1a;给分析对象定义一个语言&#xff0c;并定义该语言的文法表示&#xff0c;再设计一个解析器来解释语言中的句子。也就是说&#xff0c;用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口&#xff0c;该接口…

设计模式——状态模式19

状态模式是一种行为设计模式&#xff0c; 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。状态模式的核心是状态与行为绑定&#xff0c;不同的状态对应不同的行为。 设计模式&#xff0c;一定要敲代码理解 状态行为抽象 //在某种状态下&…

数据库——实 验 8 SQL 编程

1.T-SQL 语言简介 SQL Server 使用的语言称作 Transact-SQL, 它不仅包括基本 SQL 操作的内容&#xff0c;如 SQL 的数据查询功能和数据操作功能等&#xff0c;还有一般程序设计的能力。 2. 局部变量和全局变量的概念 1)局部变量 局部变量是一个能够拥有特定数据类型的对…

多目标应用:基于非支配排序粒子群优化算法NSPSO求解无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节&#xff0c;无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

html网页在展示时,监听网络是否断网,如果断网页面暂停点击响应

序言&#xff1a; 集合百家之所长&#xff0c;方著此篇文章&#xff0c;废话少说&#xff0c;直接上代码&#xff0c;找好你的测试网页&#xff0c;进行配置&#xff0c;然后复制粘贴代码&#xff0c;就可以了。 1.css文件内容 #newbody{display: none;width: 100%;height: 9…

【用户投稿】Apache SeaTunnel 2.3.3+Web 1.0.0版本安装部署

项目概要 Apache SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;用于实时和离线数据处理,支持多种数据源之间的数据迁移和转换。 其中&#xff0c;Apache-seatunnel-web-1.0.0-bin.tar.gz和apache-seatunnel-2.3.3-bin.tar.gz代表了 Apache SeaTunnel Web…

python语言实现语音合成(文字转语音)

python语言实现语音合成&#xff08;文字转语音&#xff09; 在Python中实现文本到语音——语音朗读功能&#xff0c;可以使用pyttsx3库。pyttsx3库的安装和使用也相对简单&#xff0c;但在控制语音的暂停、继续和停止功能方面可能存在一定的困难。 首先&#xff0c;您需要安装…

北航计算机软件技术基础课程作业笔记【4】

题目&#xff08;好像以前没加&#xff09; 二叉树与哈希表 作业 1.二叉树前序遍历结果 二叉树结构为 代码实现中序后序推理前序表达式 #include <iostream> #include <stack> #include <string> #include <vector> #include <deque> ​ // …

H800算力低至5.99元/卡时!抢鲜体验LLaMA3最佳实践就在潞晨云

由Meta发布的LLaMA3 8B和LLaMA3 70B的&#xff0c;将开源AI大模型推向新的高度。在多个基准测试上的表现均大幅超过已有竞品&#xff0c;成为AI应用的最新优选。 潞晨云现已上架 LLaMA3 8B和LLaMA3 70B从推理到微调和预训练的实践教程。 提供免费测试代金券&#xff0c;限时特…

yolov8 区域多类别计数

yolov8 区域多类别计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 初始代码4. 实验结果5. 完整代码6. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 region_point…

附近商户-GEO数据结构的基本用法

10、附近商户 10.1、附近商户-GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a…

Docker的介绍及应用

1.什么是Docker 我们在部署大型项目的时候&#xff0c;肯定会遇到这种问题&#xff0c;大学项目组件较多&#xff0c;运行环境复杂&#xff0c;部署时会碰到一些问题&#xff1a;例如node、redis、mysql等这些应用都有自己的依赖和函数库。这种复杂的依赖关系很容易出现兼容问…