1,题目要求
Given a string S and a character C, return an array of integers representing the shortest distance from the character C in the string.
给定一个字符串和其中的一个特定的字符,判断字符串中的字符到该种字符的最小距离,返回一个这样的最小距离表。
2,题目思路
个人最开始的思路就是遍历,然后找到特定的位置。再经过一次遍历,计算每个字符到给定字符位置的最小距离即可。
但是这样的遍历存在一些问题:比如开头和结尾处的字符要进行特殊的处理——因为距离之和第一个和最后一个给定字符位置有关。但中间的字符却和左右距离的最小值有关。如果要解决这样的问题,就要进行逊汗嵌套,对于每一个字符,计算其到每一个对应pos的距离的最小值。这样的开销稍微大一些,但是可解。
另一个解决思路为,使用前后两次遍历,对距离字符右方和字符左方的给定字符的距离进行计算,最后取最小值即可。
3,程序源码
1,
class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int n = S.size();
vector<int> res(n,0);
vector<int> pos;
for(int i=0;i<n;i++)
if(S[i]==C)
pos.push_back(i);
for(int i =0;i<n;i++){
if(S[i]!=C){
int dis = n * n;
for(int j = 0;j<pos.size();j++)
dis = min(dis, abs(pos[j] - i));
res[i]=dis;
}
}
return res;
}
};
2,
class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int n = S.size();
vector<int> res (n, n);
int e_pos = -(n*n);
for(int i = 0;i<n;i++) //从前往后进行遍历
{
if(S[i] == C)
e_pos = i;
res[i] = min(res[i], abs(i-e_pos));
}
for(int i = n-1;i>=0;i--) //从后往前遍历
{
if(S[i] == C)
e_pos = i;
res[i] = min(res[i], abs(i-e_pos));
}
return res;
}
};
注:
vector<int> res (n,m);
表示创建一个向量,长度为n,且每一个值均为m。