拿捏几道经典的字符串模拟问题
创始人
2024-05-09 21:48:32
0

希望本篇对你有所帮助

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

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

输入: 
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& banned) {unordered_mapmp;//用来记录单词出现的次数string word="";for(int i=0;i='A'&¶graph[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;i2)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_setset(s.begin(),s.end());//return set.size()

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

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

看到就是赚到!!

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

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

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

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

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

相关内容

热门资讯

电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...
android系统和安卓哪个好... 说到手机操作系统,你有没有想过,Android系统和安卓哪个更好用呢?这可是个让无数手机用户纠结的问...