821. 字符的最短距离 - 力扣

1. 题目

给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。

返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。

两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。

2. 示例

3. 分析 

我们先尝试一下暴力解法:将目标字符每次出现的位置保存到数组中,然后遍历字符串依次比较每个字符与目标字符每次出现的位置进行比较,寻找较小值即可

class Solution {
public:vector<int> shortestToChar(string s, char c) {vector<int> index;vector<int> ans;int n = s.size();// 记录目标字符出现的位置for(int i = 0; i < n; i++){if(s[i] == c){index.push_back(i);}}// 遍历字符串,对每个字符与目标字符出现下标进行比较,寻找较小值for(int i = 0; i < n; i++){int minres = INT_MAX;for(int j = 0; j < index.size(); j++){minres = min(minres, abs(index[j]-i));}ans.push_back(minres);}return ans;}
};

时间复杂度:O(N2)


能不能做到 O(N),可以的:

问题可以转换成,对 每个字符s[i] 的下标 i,求

  • 每个字符s[i]到其左侧最近的字符 c 的距离。
  • 每个字符s[i]到其右侧最近的字符 c 的距离。

这两者的较小值。

分别对字符串从左往右、从右往左遍历。

从左往右:在遍历的同时记录二者的距离,也需更新目标字符的下标。但在刚开始遍历时,目标字符可能不存在,所以二者距离也因此不能记录,所以为了记录二者的距离,我们可以使用 -n 初始化目标字符下标,这里 n 是 字符串的长度,距离就为 abs(index - i)。若找到第一个目标字符,二者距离也为 abs(index - i)。

从右往左:同理。初始化目标字符下标为 2n这里 n 是 字符串的长度。顺便比较此时二者距离与从左往右遍历时二者距离哪个为较小者。

class Solution {
public:vector<int> shortestToChar(string s, char c) {int n = s.size();vector<int> ans(n);// 从左往右for(int i = 0, index = -n; i < n; i++){if(s[i] == c) index = i;ans[i] = i - index;}// 从右往左for(int i = n - 1, index = 2*n; i >= 0; i--){if(s[i] == c) index = i;ans[i] = min(ans[i], index - i);}return ans;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营day36 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和 分几步做&#xff0c;思路清晰 按绝对值从大到小的顺序进行排序从前向后遍历&#xff0c;遇到负数将其变为正数&#xff0c;同时K--如果K还大于0&#xff0c;那么反复转变数值最小的元素&#xff0c;将K用完求和 class Solution:def largestSu…

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构&#xff0c;但是本身element里并不支持&#xff0c;于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。 目录 1.拷贝代码放到自己的项目目录中 2.改造el-transfer的源码 3.修改tree-transfer-panel.vue文件 4.修改…

数据挖掘实战-基于余弦相似度的印度美食推荐系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【模版方法设计模式】

文章目录 模板方法设计模式模板方法的设计原则模板方法设计模式组成部分代码实现抽象类实现具体实现类执行 模板方法设计模式 模版方法设计模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一…

最最最重要的集群参数配置(上)no.7

我希望通过两期内容把这些重要的配置讲清楚。严格来说这些配置并不单单指Kafka服务器端的配置&#xff0c;其中既有Broker端参数&#xff0c;也有主题&#xff08;后面我用我们更熟悉的Topic表示&#xff09;级别的参数、JVM端参数和操作系统级别的参数。 需要你注意的是&…

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接

前言 前段时间遇到一个需求&#xff1a;导出变量到Excel里面&#xff0c;这里给出一些命令&#xff0c;同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中&#xff0c;可以使用以下命令来读写Excel文件&#xff1a; 读取Excel文件&#xff1a; xlsread(filen…

Java EE-Spring AOP 面向切面编程

Spring AOP https://www.cnblogs.com/joy99/p/10941543.html 超级详细版&#xff1a;Chapter 6. 使用Spring进行面向切面编程&#xff08;AOP&#xff09; AOP 原理 面向切面 ( Aspect Orient Programming ) 面向切面编程&#xff0c;是面向对象编程(OOP) 的一种补充。 在…

基于Qt的网上购物系统的设计与实现

企鹅&#xff1a;2583550535 代码和论文都有 第1章 绪论... 1 1.1 项目背景... 1 1.2 国内外研究现状... 1 1.3 项目开发意义... 3 1.4 报告主要内容... 3 第2章 关键技术介绍... 4 2.1 后端开发技术... 4 2.1.1 C. 4 2.1.2 Qt框架... 4 2.1.3 MySQL数据库... 5 2.2 …

信息学奥赛一本通(C++版)2034:【例5.1】反序输出

题目描述 输入&#x1d45b;个数,要求程序按输入时的逆序把这&#x1d45b;个数打印出来&#xff0c;已知整数不超过100个。也就是说&#xff0c;按输入相反顺序打印这&#x1d45b;个数。 输入 输入一行共有&#x1d45b;个数&#xff0c;每个数之间用空格隔开。 输出 如题要求…

CentOS 7 搭建mqtt服务简介

在CentOS 7上搭建MQTT服务&#xff0c;你可以选择一个MQTT broker来实现。一个流行的选择是Eclipse Mosquitto&#xff0c;它是一个轻量级的MQTT broker&#xff0c;非常适合在资源有限的系统上运行。以下是在CentOS 7上安装和配置Eclipse Mosquitto的步骤&#xff1a; 1. 安装…

windows 自定义scheme协议

注册表里面按照如下格式填写自定义scheme协议即可&#xff1a;Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\jdtest] "URL:jdtest Protocol" "URL Protocol"""[HKEY_CURRENT_USER\jdtest\DefaultIcon] "E:\\Program Files (x86…

德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位

全球四大会计事务所之一的德勤&#xff08;Deloitte&#xff09;在官网发布了一份&#xff0c;名为《Generative AI in Asia Pacific: Young employees lead as employers play catch-up》的深度调查报告。 主要查看中国、澳大利亚、印度、日本、新加坡、韩国、中国台湾等亚太…

Prompt Engineering Guide

本文转载自&#xff1a;Prompt Engineering Guide https://www.promptingguide.ai/zh/introduction/basics 文章目录 提示工程简介1、基本概念1&#xff09;基础提示词2&#xff09;提示词格式 2、提示词要素3、设计提示的通用技巧从简单开始指令具体性避免不精确做还是不做&am…

操作系统实验:进程和线程同步和互斥(生产者消费者问题,睡觉的理发师问题)

1.生产者消费者问题&#xff08;信号量&#xff09; 参考教材中的生产者消费者算法&#xff0c;创建5个进程&#xff0c;其中两个进程为生产者进程&#xff0c;3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母&#xff0c;另一个生产者进程试图不断地…

Linux基础-apt命令

apt命令 一、概述二、常用命令解析1. 查询信息1. apt list &#xff1a;查询具体包的版本信息2. apt search &#xff1a;模糊查找包的所有可能的包3. apt policy &#xff1a;查询包的版本和源信息4. apt show &#xff1a;查询包相关的最详细的信息5. apt depend : 查询包的依…

OrangePi Kunpeng Pro开发板初体验——家庭小型服务器

引言 在开源硬件的浪潮中&#xff0c;开发板作为创新的基石&#xff0c;正吸引着全球开发者的目光。它们不仅为技术爱好者提供了实验的平台&#xff0c;更为专业开发者带来了实现复杂项目的可能性。本文将深入剖析OrangePi Kunpeng Pro开发板&#xff0c;从开箱到实际应用&…

前端开发实用工具网站(持续更新中)

实用的在线代码编辑器&#xff1a; https://codesandbox.io/ https://codepen.io/ StackBlitz | Instant Dev Environments | Click. Code. Done. HTML在线转换为JSX HTML to JSX HTML在线转换为Pug HTML to Pug JavaScript 在线转换为typescript JavaScript to Typesc…

vue3父子组件通信,子组件修改父组件传过来的值

一、第一种&#xff0c;通过props方式传值&#xff1a; 父组件&#xff1a; 父组件调用子组件Child1时通过 :msg2 "msg2"把msg2的数据传给子组件&#xff0c;并且通过自定义事件接收子组件的emit通知&#xff0c;用来修改父组件的msg2数据。 源码&#xff1a; &l…

android mqtt(轻量级物联网消息推送)

MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xff0c;是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机…

融资融券操作指南(附最低费率开户渠道)

部分朋友在开通融资融券后&#xff0c;对于融资融券的操作不是很熟练&#xff0c;并且存在很多问题。其实&#xff0c;融资融券核心就是一个“借”&#xff0c;你借券商的资金或者股票&#xff0c;看多时借入资金买入&#xff0c;看空时借入券源卖出。你不可能空口白牙的去借&a…