版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86632317
day26, 字符的最短距离
题目来源:leetcode
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
示例 1:
输入: S = “loveleetcode”, C = ‘e’
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
解答:首先确定 指定字符 的个数。 如果只有一个指定字符,直接遍历求举例即可。
如果有多个指定字符,首先处理第一个之前和最后一个指定字符之后的距离,这里的距离为下标相减。
之后处理 第一个 和最后一个之间的指定字符距离,这里分两次遍历,第一次遍历的距离为 元素与左侧的指定字符的距离,第二次遍历为 元素其右侧指定字符的距离。二者取较小值即可。
代码:
vector<int> shortestToChar(string S, char C) {
vector<int> record;
vector<int> result( S.size());
for( int i = 0; i < S.size(); i++)
if( S[i] == C)
record.push_back( i);
//只有一个指定字符的情况
if( record.size() == 1){
for( int i = 0; i < S.size(); i++)
result[i] = abs( record[0] - i);
return result;
}
//有多个指定字符的情况
//首先处理到第一个字符
for( int i = 0; i <= record[0]; i++)
result[i] = abs( record[0] - i);
//处理最后一个字符
for( int i = record[ record.size() - 1]; i < S.size(); i++)
result[i] = abs( record[ record.size() - 1] - i);
//对于其他情况
//从左侧开始
int k = 0;
for( int i = record[0] + 1; i < record[ record.size() - 1]; i++){
result[i] = ( abs( record[k] - i));
if( i == record[k + 1])
k++;
}
//从右侧更新
k = 1;
for( int i = record[0] + 1; i < record[ record.size() - 1]; i++){
result[i] = min( result[i],abs( record[k] - i));
if( i == record[k])
k++;
}
return result;
}
运行结果: