leetcode-821-Shortest Distance to a Character
题目描述:
Given a string S
and a character C
, return an array of integers representing the shortest distance from the character C
in the string.
Example 1:
Input: S = "loveleetcode", C = 'e'
Output: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
Note:
S
string length is in[1, 10000].
C
is a single character, and guaranteed to be in stringS
.- All letters in
S
andC
are lowercase.
要完成的函数:
vector<int> shortestToChar(string S, char C)
说明:
1、给定一个字符串S和字符C,找到字符串S中字符C的位置(可能有多个字符C),返回字符串S中所有字符距离最近的字符C的距离。
比如S为leetcode,C为e,那么返回的距离vector就是[3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]。
2、这道题题意很清晰,也有点像之前做过的一道题,笔者在这里模仿那道题的做法。
给一个例子说明一下,比如S为leetcodell,C为e。
那么我们先把每个字符都跟它右边或者本身的e比较距离,如果右边没有e了,那么插入INT_MAX。
遍历一遍字符串S,我们可以得到[1,0,0,4,3,2,1,0,INT_MAX,INT_MAX]。
接着我们再把每个字符都跟它左边或者本身的e比较距离,这个距离跟上述得到的距离,取一个最小值。如果左边没有e了,那么不做处理。
遍历一遍字符串S,最后得到的距离vector就是我们要的了。
上述做法,其实是把每个左边有e右边也有e的字符,计算一下距离左边的距离,再计算一下距离右边的距离,然后取一个最小值。
对于那些只有右边有e的字符,只处理一次,对于只有左边有e的字符,也只处理一次。
代码实现如下(附详解),分享给大家:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | vector< int > shortestToChar(string S, char C) { vector< int >index; //记录S中C的位置 vector< int >res; //最后要返回的距离vector int s1=S.size(); for ( int i=0;i<s1;i++) //不断插入C的位置 { if (S[i]==C) index.push_back(i); } int i=0,j=0,s2=index.size(); while (i<s1) //计算每个字符跟右边C的距离 { if (j<s2) //如果右边有C { if (i<index[j]) { res.push_back(index[j]-i); i++; } else if ((i==index[j])) { res.push_back(0); j++; i++; } } else //如果右边没有C,那么插入INT_MAX { res.push_back(INT_MAX); i++; } } i=s1-1,j=s2-1; while (j>=0) //如果左边有C,计算每个字符跟左边C的距离 { if (i>index[j]) { res[i]=min(res[i],i-index[j]); //只保留最小值 i--; } else if ((i==index[j])) { j--; i--; } } return res; } |
上述代码实测15ms,因为服务器接受到的cpp submissions有限,所以没有打败的百分比。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步