思路:
先把所有的指定字符的索引找到;
其余非指定字符的字符,都可以归纳为:在某相邻指定字符之间。二分查找就是要快速找到它在哪个区间(指定字符索引值区间)内;
二分使用注意点:每次更新left right的方式:(+1/-1 ? 直接=?)和“找到的条件”;
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define NUM_MAX 1000
int FindMin (int in, int left, int right, int *cPosMap)
{
int dis = abs(cPosMap[left] - in);
for (int i = left; i <= right; i++) {
dis = fmin(dis, abs(cPosMap[i] - in));
}
return dis;
}
int BinaSearch (int in, int *cPosMap, int cPosMapNum)
{
int left = 0;
int right = cPosMapNum - 1;
int dis;
while (left <= right) {
int mid = (left + right) / 2;
if (right - left <= 1) {
dis = FindMin(in, left, right, cPosMap);
return dis;
} else if (cPosMap[mid] >= in) {
right = mid;
} else {
left = mid;
}
}
return dis;
}
int* shortestToChar(char * s, char c, int* returnSize){
int cPosMap[NUM_MAX] = {0};
int cNum = 0;
int len = strlen(s);
int *ans = (int *)calloc(len, sizeof(int));
for (int i = 0; i < len; i++) {
if (s[i] == c) {
cPosMap[cNum++] = i;
ans[i] = 0;
}
}
for (int i = 0; i < len; i++) {
if (s[i] != c) {
ans[i] = BinaSearch(i, cPosMap, cNum);
}
}
*returnSize = len;
return ans;
}