给定一个字符串 S
和一个字符 C
。返回一个代表字符串 S
中每个字符到字符串 S
中的字符 C
的最短距离的数组。
示例 1:
输入: S = "loveleetcode", C = 'e'
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
说明:
- 字符串
S
的长度范围为[1, 10000]
。 C
是一个单字符,且保证是字符串S
里的字符。S
和C
中的所有字母均为小写字母。
【思路】该题可以分情况讨论:
情况一:被计算长度的那个字符只有一边有给定的字符C,即开头和结尾;
情况二:被计算长度的那个字符夹在两个C字符中间。
class Solution {
public:
vector<int> shortestToChar(string S, char C) {
vector<int> ret(S.size());
int fpos = S.find(C, 0);//第一个C的位置
int i;//记录位置
for (i = 0; i <= fpos; i++)
{
ret[i] = fpos - i;
}
//i++;
while (S[i] != '\0')
{
int pos = S.find(C, i);
if (pos == -1)//最后没有C字符了
{
for (int k = 0; k < S.size() - i; k++)
{
ret[i + k] = k + 1;
}
break;
}
else//找到下一个C字符
{
if ((pos - i) % 2 == 0)//相同C字符之间为偶数个字符
{
for (int j = 0; j < (pos - i) / 2; j++)
{
ret[i + j] = j + 1;
ret[pos - j - 1] = j + 1;
}
}
else相同C字符之间为奇数个字符
{
for (int j = 0; j < (pos - i) / 2; j++)
{
ret[i + j] = j + 1;
ret[pos - j - 1] = j + 1;
}
ret[i + (pos - i) / 2] = (pos - i) / 2 + 1;
}
}
i += pos - i + 1;//移动到C的下一个字符
}
return ret;
}
};