一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。
个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)
4.19:字符的最短距
LeetCode 821,点击题目可直接跳转至LeetCode
题解一:暴力
首先将字符串s中所有字符c的位置存入数组中,然后遍历字符串s,假设当前遍历位置为i,再二重循环遍历所有字符c的位置,找出两个下标之间的最小距离。
时间复杂度:
C++代码:
class Solution {
public:
vector<int> shortestToChar(string s, char c) {
vector<int> pos_arr;
int n=s.length();
for(int i=0;i<n;i++){
if(s[i]==c) pos_arr.push_back(i);
}
vector<int> ans(n,0x3f3f3f3f);
for(int i=0;i<n;i++){
for(auto j:pos_arr){
ans[i]=min(ans[i],abs(i-j));
}
}
return ans;
}
};
题解二:两次遍历
- 第一次遍历,从左到右遍历,找出s[i]到左侧最近的字符c的距离
- 第二次遍历,从右到左遍历,找出s[i]到右侧最近的字符c的距离
然后选择其中的最小值即可。
注意:可能存在此时并没出现过字符c的情况(例如:从左到右遍历时,左侧并没有字符c,从右到左遍历同理)所以需要初始化一个最大值,为方便处理:
- 从左开始遍历时,我们可以初始字符c的位置为:,如果未出现则取:,显然可行
- 从右开始遍历时,我们可以初始字符c的位置为:,如果未出现则取:,显然可行
当然也可以直接初始化非常大的值。
C++代码:
class Solution {
public:
vector<int> shortestToChar(string s, char c) {
int n=s.length();
vector<int> ans(n);
int pos=-n;
for(int i=0;i<n;i++){
if(s[i]==c) pos=i;
ans[i]=i-pos;
}
pos=2*n;
for(int i=n-1;i>=0;i--){
if(s[i]==c) pos=i;
ans[i]=min(ans[i],pos-i);
}
return ans;
}
};