拿捏几道经典的字符串模拟问题

news2024/11/28 16:01:38

希望本篇对你有所帮助

我发现这种字符串的问题其实写起来很麻烦,可能思路不难多少都能想到一些,主要就是代码的处理,细节问题。太考验代码编写的能力了。这两天写了好多道字符串,模拟之类的问题,今天就分享分享吧

刚开始刷题的朋友开卷有益啊

输入: 
paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
banned = ["hit"]
输出: "ball"
解释: 
"hit" 出现了3次,但它是一个禁用的单词。
"ball" 出现了2次 (同时没有其他单词出现2次),所以它是段落里出现次数最多的,且不在禁用列表中的单词。 
注意,所有这些单词在段落里不区分大小写,标点符号需要忽略(即使是紧挨着单词也忽略, 比如 "ball,"), 
"hit"不是最终的答案,虽然它出现次数更多,但它在禁用单词列表中。

首先读懂题意:

几个关键点

  1. 答案是唯一的
  2. 在做判断的时候不区分大小写,意思就是AOB等于aob
  3. 再者要在禁用列表里面找是不是禁用的单词
  4. 自动忽略标点符号,意思就是bob?或者bob.或者bob, 这些都按照bob这个单词去处理
  5. 拿到这题肯定第一反应就是用哈希表来映射,这是没问题的,那么就需要我们在里面做一个处理,我们记录的单词不能带标点

大致思路就出来了,定义一个map去记录各个单词映射,然后很多题解是把原来的这个字符串paragraph存到了一个字符串数组里面,这样方便遍历,然后把禁用列表用一个set再去存一下方便去find

不过这样我感觉空间就有了开销,我是这样写的

遍历整个字符串paragraph,用一个word去记录每次遇到的字母,只要是正常的字母我们就添加到word上面,如果遇到了空格或者标点了就说明我们这个单词记录完毕了,在单词列表里用find去查询此时记录的word,如果没找到说明可以把它记在map里面,然后每次做完这个判断就把word置为“”,用来进行下一个单词的组装

这样的话就用一个word来回组装,一遍遍历完成了给map的映射,最后再去map里面找最大的就行

代码如下:

 string mostCommonWord(string paragraph, vector<string>& banned) {
        unordered_map<string,int>mp;//用来记录单词出现的次数
        string word="";
        for(int i=0;i<paragraph.size();++i)
        {
            //因为不区分大小写,所以要做if判断
            if(paragraph[i]>='A'&&paragraph[i]<='Z')
            {
                //如果是大写,要转成小写
                //word+=tolower(paragraph[i]);
                word+=paragraph[i]-'A'+'a';
            }
            else if(islower(paragraph[i]))//如果是小写
            {
                word+=paragraph[i];
            }
            else if(word!="")//其实就是判断了是各种标点或者空格了
            {                 //走到这就说明word已经加成了一个完整的单词
                              //就要开始判断在不在禁用列表中
                if(find(banned.begin(),banned.end(),word)==banned.end())//没找到
                {
                    mp[word]++;
                }
                word="";
            }
        }
        int maxlen=1;//遍历map,找出现次数最多的那个
        for(auto &x:mp)
        {
            if(maxlen<=x.second)
            {
                maxlen=x.second;
                word=x.first;
            }
        }
        return word;

    }

----------------------------------

再来一道叫做亲密的字符串,让我们看看他有多亲密啊

示例 1:

输入:s = "ab", goal = "ba"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。

示例 2:

输入:s = "ab", goal = "ab"
输出:false
解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。

示例 3:

输入:s = "aa", goal = "aa"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。

拿到这题我最早想着就直接暴力,两个for循环两两交换去比较

pa的一下很快啊,代码出来了,很顺利啊,没有ac啊,超时了家人们,太慢了

我当初写的时候也是抱着侥幸心理哈哈哈,果然超时了

既然暴力走不通那么就好好审题,找找规律看看都有什么情况我们要做处理,反正我当初愣是没想到要记录下标到数组,废了老大功夫去做。

如果读完题你能想到,map和记录下标,那么这个题就没问题了

看看力扣给的示例我们ab和ba,我们会发现两个字符串的两个位置都不相同,且交换之后就相同了;示例ab和ab他本身相同,但是一交换就不相同了;示例aa和aa,本身相同且相同的字母有多个,意思就是aa是重复的,我们交换了,最终两个结果还是一样

这道题就是必须要交换一次,且只能交换一次

分析完三个示例,就能得到下面的规律:

  1. 两种情况
  2. s和goal有两个位置不相同,且这两个位置交换之后,就相等了
  3. 如果s和goal不相同的位置大于2了,肯定就不相同了
  4. s和goal完全相同,并且s有多余相同的字符,这样的话s和goal才能返回true
  5. 什么意思?ab  和ab都相同但是,交换就会有问题
  6.  aab和aab相同 a有多余 交换aa还是不变的 ,就说明可以返回true

看到这,我们就有思路了呀,定义一个map去记录s各个字母出现的次数,如果s里有多余出现的字母,我们就做个标记。在遍历s的时候如果当前位置的s字母和goal字母不一样了,说明有一个位置了,我们把这个位置保存在下标数组里面;我们定义下标数组的时候这个数组其实最终要么为空要么为2,为2就说明两处不一样可以去交换了,如果大于2了那么肯定一次交换是不行的,结果肯定就是false了 。

思路如下: 

统计字符串s,goal中字符不匹配的下标。

不匹配的下标个数不等于 0 或 2 时,不能由s得到goal。

不匹配的下标个数等于0时,s与goal中字符完全相同,还需要s中有重复字符。

不匹配的下标个数等于2时,判断交换两对字符后是否匹配。

这样pa的一下啊 代码又出来了

    bool buddyStrings(string s, string goal) {
        if(s.size()!=goal.size())return false;
        int flg=0;//有多余相同字母的标记
        for(int i=0;i<s.size();++i)
        {
            if(s[i]!=goal[i])
            {
                index.push_back(i);
            }
            if(index.size()>2)return false;//大于2个位置不一样了
            mp[s[i]]++;
            if(mp[s[i]]>1)//说明有重复的
            {
                flg=1;
            }
        }
        //有两个不相同
        if(index.size()==2&&s[index[0]]==goal[index[1]]&&s[index[1]]==goal[index[0]])
        {
            return true;
        }
        //都相同 且有重复字符
        if(index.size()==0&&flg)
        {
            return true;
        }
        //还有一种写法 不用map,和flg标记
        //当index的size等于0的时候,用s来构建一个set
        //unordered_set<char>set(s.begin(),s.end());
        //return set.size()<s.size();如果s里面有重复的那么set的长度肯定小于s长度
        return false;
    }

数组啊字符串很多题都是考能不能找到规律的问题,需要双指针,滑动窗口,map这些都是这一类题常见的解题技巧。

蹬蹬补充一道题:不是字符串的题,不过当初自己写的时候感觉蛮有意思(就是自己菜,没找到简单的规律),单独给这个题记录一篇博客,感觉太水了,我就浅浅加在这一篇吧。

看到就是赚到!!

这个思路是最最最简单的,反正我也是看了题解才知道OO~~哦可以这样

找到开头连续的0,找到结尾连续的0,再找中间连续的最大0

返回这三个里面最长的就行

 int maxDistToClosest(vector<int>& seats) {
        //找到开头连续0个数,结尾连续0
        //中间连续0,取最大
        int kaitou=0,jiewei=0,mid=0;
        int i=0,j=seats.size();
        while(i<j&&seats[i]==0)
        {
            kaitou++;
            i++;
        }
        while(j>0&&seats[j-1]==0)
        {
            jiewei++;
            j--;
        }
        int temp=0;//记录一下中间每次连着0的个数
        for(int k=i+1;k<j;++k)
        {
            if(seats[k]==0)
            {
                temp++;
            }
            else
            {
                mid=max(temp,mid);
                temp=0;
            }
        }
        return max(max(kaitou,jiewei),(mid+1)/2);

    }

其实写了很多题,好题太多了,我就挑一些不错的给大家分享分享~

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

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

相关文章

算法设计与分析-DP习题

7-1 最小路径和给定一个m行n列的矩阵&#xff0c;从左上角开始每次只能向右或者向下移动&#xff0c;最后到达右下角的位置&#xff0c;路径上的所有数字累加起来作为这条路径的和。求矩阵的最小路径和。输入格式:输入第一行&#xff1a;两个正整数m和n(1<m, n<1000)&…

【C++】非类型模板参数、模板特化、模板的分离编译、模板总结

文章目录一、非类型模板参数二、模板特化1.函数模板特化2.类模板特化三、模板的分离编译四、模板总结一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 #define N 10…

Spring_FrameWork_05(AOP)

Spring整合Junit RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classes SpringConfig.class)加载test运行类和spring配置文件 使用Junit提供的Runwith注解&#xff0c;将Junit原有的运行器替换成spring提供的SpringJUnit4ClassRunner。 这个注解的值就是运…

【计算机视觉】Softmax代码实现、过拟合和欠拟合的表现与解决方法

Softmax原理 Softmax函数用于将分类结果归一化&#xff0c;形成一个概率分布。作用类似于二分类中的Sigmoid函数。 对于一个k维向量z&#xff0c;我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果&#xff0c;具体计算公式为&#xff1a; 对于k…

程序员不了解这些投简历的巨坑,面试注定一开始就失败!

目录 前言第一阶段&#xff1a;练手第二阶段&#xff1a;冲刺第三阶段&#xff1a;收尾 前言 之前写了两篇文章&#xff0c;给大家介绍了一下如何利用短期的时间&#xff0c;尽可能充分的为面试做准备&#xff1a; 1.《我只是把握好了这3点&#xff0c;1个月后成功拿下大厂…

2023春节祝福系列第一弹(下)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

2023春节祝福系列第一弹&#xff08;下&#xff09; &#xff08;放飞祈福孔明灯&#xff0c;祝福大家身体健康&#xff09; &#xff08;附完整源代码及资源免费下载&#xff09; 目录 四、画一朵真实的祥云 &#xff08;1&#xff09;、画一个渐变的白色径向渐变背景 &a…

外业调查工具助手,照片采集、精准定位、导航、地图查看

你是不是在外业调查时要背着一堆图纸 是不是一不小心图纸污损或丢失&#xff0c;工作又得重做 是不是经常会出现图纸标注的空间不足 是不是外业采集中要携带一大堆繁琐的仪器 是不是每次收集的数据、照片等在整理的过程中发现工作量巨大 是不是经常会出现采集回来的内容跟…

《MySQL 入门教程》第 36 篇 Python 访问 MySQL

本篇我们介绍如何利用 Python DB API 连接和操作 MySQL 数据库&#xff0c;包括数据的增删改查操作、存储过程调用以及事务处理等。 Python 是一种高级、通用的解释型编程语言&#xff0c;以其优雅、准确、 简单的语言特性&#xff0c;在云计算、Web 开发、自动化运维、数据科…

Spark / Java - atomic.LongAccumulator 与 Spark.util.LongAccumulator 计数使用

目录 一.引言 二.atomic.LongAccumulator 1.构造方法 2.使用方法 3.创建并使用 三.Spark.util.LongAccumulator 1.构造方法 2.使用方法 一.引言 使用 Spark 进行大数据分析或相关操作时&#xff0c;经常需要统计某个步骤或多个步骤的相对耗时或数量&#xff0c;java.u…

Java设计模式-适配器模式Adapter

介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主的目的是兼容性&#xff0c;让原本 因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类&#xff1a;类适配器模式、…

树莓派自带的python3.9->python3.7

卸载python3.9&#xff1a;sudo apt-get remove python3卸载之后一些包可以使用sudo apt autoremove这个命令删除卸载成功如果出现问题后续再来更新&#xff08;出现问题后后续安装python也会失败&#xff09;&#xff08;先不要安装先看&#xff09;安装python3.7&#xff1a;…

C语言第30课笔记

1.strerror(errno要包含头文件errno.h) 2.perror头文件为stdio.h 3.一些字符函数 4.字母大小写转换函数 5.memmove理论上是memcpy的升级版(可以自己拷贝自己)。 6.匿名结构体类型在类型创建好了之后直接创建变量&#xff0c;只能用一次。两个完全相同的匿名结构体类型&#xf…

【八】Netty HTTP协议--文件服务系统开发

Netty HTTP协议--文件服务系统开发介绍HTTP-文件系统场景描述流程图代码展示netty依赖服务端启动类 HttpFileServer服务端业务逻辑处理类 HttpFileServerHandler结果展示错误路径文件夹路径文件路径遗留bugbug版本总结介绍 由于Netty天生是异步事件驱动的架构&#xff0c;因此…

java EE初阶 — Synchronized 的原理

文章目录1. Synchronized 的优化操作1.1 偏向锁1.2 轻量级锁&#xff08;自旋锁&#xff09;1.3 重量级锁2. 其他的优化操作2.1 锁消除2.2 锁粗化3. 相关面试题1. Synchronized 的优化操作 两个线程针对同一个对象加锁&#xff0c;就会产生阻塞等待。 Synchronized 内部其实还有…

ubuntu docker elasticsearch kibana安装部署

ubuntu docker elasticsearch 安装部署 所有操作尽量在root下操作. 安装docker 1. 由于是基于宝塔面板安装的所以简答的点击操作即可完成安装. 我这里已经是正常的安装好了. 2.dcoker 镜像加速 https://cr.console.aliyun.com/cn-hangzhou/instances访问这个网址进去进行了…

快速上手Golang

自动推导赋值:自动推导赋值Go中 不同的数据类型不能进行计算对于浮点型默认都是float64 精确到小数点后15位单引号的 为字节类型 一位0~255的字符转换双引号的 为字符串类型多重赋值多重赋值a,b:1,2格式输出格式输出printf“%3d”三位整数&#xff0c;不满足三位时头部补空格“…

录制课程用什么软件好?3款超好用的课程视频录课软件

在互联网技术的飞速发展下&#xff0c;在线教学已经成为一种新型的教学形式&#xff0c;与传统的教学方法相比&#xff0c;在线教学具有低成本、突破地域、时间灵活、形式多样的教学方式。那录制课程用什么软件好&#xff1f;今天小编就跟大家分享3款超好用的课程视频录课&…

认真研究MySQL的主从复制(一)

【1】主从复制概述 ① 如何提升数据库并发能力 在实际工作中&#xff0c;我们常常将Redis作为缓存与MySQL配合使用&#xff0c;当有请求的时候&#xff0c;首先会从缓存中进行查找。如果存在就直接取出&#xff0c;如果不存在再访问数据库。这样就提升了读取的效率&#xff0…

中国数据库的诸神之战

作者 | 唐小引出品 | 《新程序员》编辑部“现在的数据库产品实在是太多了&#xff01;”前几天&#xff0c;我和深耕数据库/大数据近 30 年的卢东明老师相聊时&#xff0c;他发出了这样的感慨。将包括 DB-Engines Ranking 以及国内数据库排行等在内的数据库产品列表进行汇总&am…

快速入门Freemarker模块引擎技术

1、 freemarker 介绍 ​ FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&am…