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.
解决
S
的长度为n
1.暴力解决
解决步骤:
- 确定
C
在S
中的所有下标 - 遍历
S
以确定S
中每个字符到C
的最短距离
分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int len = S.length();
vector<int> result(len, 0);
vector<int> index = findIndex(S, C);
for (int i = 0; i < len; i++) {
if (S[i] != C) result[i] = minDistance(index, i);
}
return result;
}
// 确定C在S中的所有下标
vector<int> findIndex(string S, char C) {
int len = S.length();
vector<int> index;
for (int i = 0; i < len; i++) {
if (S[i] == C) index.push_back(i);
}
return index;
}
// 确定S[i]到C的最短距离
int minDistance(vector<int> a, int index) {
int n = a.size();
int dis = 10001;
for (int i = 0; i < n; i++) {
int temp = abs(index - a[i]);
if (temp < dis) dis = temp;
}
return dis;
}
};
2.动态规划
S
中的每个字符到C
的距离有以下规律:
dis[i] = 0
,S[i] == C
dis[i] = min(dis[i - 1] + 1, dis[i + 1] + 1)
,S[i] != C
dis[i] = dis[i + 1] + 1
,i == 0
且S[i] != C
dis[i] = dis[i - 1] + 1
,i == n - 1
且S[i] != C
分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
class Solution {
public:
vector<int> shortestToChar(string S, char C) {
int len = S.length();
vector<int> result(len, len);
int flag = -len;
for (int i = 0; i < len; i++) {
if (S[i] == C) flag = i;
result[i] = min(result[i], abs(i - flag));
}
for (int i = len - 1; i >= 0; i--) {
if (S[i] == C) flag = i;
result[i] = min(result[i], abs(i - flag));
}
return result;
}
};