开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
一、题目描述:
给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。
返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。
两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。
示例 1:
输入:s = "loveleetcode", c = "e"
输出:[3,2,1,0,1,0,0,1,2,2,1,0]
解释:字符 'e' 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。
距下标 0 最近的 'e' 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。
距下标 1 最近的 'e' 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。
对于下标 4 ,出现在下标 3 和下标 5 处的 'e' 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。
距下标 8 最近的 'e' 出现在下标 6 ,所以距离为 abs(8 - 6) = 2 。
示例 2:
输入:s = "aaab", c = "b"
输出:[3,2,1,0]
提示:
- 1 <= s.length <= 10^4
- s[i] 和 c 均为小写英文字母
- 题目数据保证 c 在 s 中至少出现一次
二、思路分析:
- 入口检查以及边界就不用说了
- 先遍历字符串,将目标字符在字符串中出现的index记录在一个临时的int tmp[]中
- 再遍历字符串,将每个字符的index与tmp[]中记录的索引比较,求得最小值
三、AC 代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* shortestToChar(char * S, char C, int* returnSize){
int strLen = 0;
int *res = NULL;
int *pTmpArray = NULL;
int count = 0;
if(NULL == S || S[0] == '\0' || NULL == returnSize)
{
return NULL;
}
if(C < 'a' || C > 'z')
{
*returnSize = 0;
return NULL;
}
strLen = strlen(S);
if(strLen < 1 || strLen > 10000)
{
*returnSize = 0;
return NULL;
}
if(strLen == 1)
{
if(S[0] == C)
{
*returnSize = 1;
res = (int *)malloc(sizeof(int));
if(NULL == res)
{
*returnSize = 0;
return NULL;
}
res[0] = 0;
return res;
}
else
{
*returnSize = 0;
return NULL;
}
}
pTmpArray = (int *)malloc(strLen*sizeof(int));
if(NULL == pTmpArray)
{
*returnSize = 0;
return NULL;
}
for(int i = 0; i < strLen; ++i)
{
if(S[i] < 'a' || S[i] > 'z')
{
free(pTmpArray);
pTmpArray = NULL;
*returnSize = 0;
return NULL;
}
if(S[i] == C)
{
pTmpArray[count] = i;
count++;
}
}
if(count == 0)
{
free(pTmpArray);
pTmpArray = NULL;
*returnSize = 0;
return NULL;
}
res = (int *)malloc(strLen*sizeof(int));
if(NULL == res)
{
free(pTmpArray);
pTmpArray = NULL;
*returnSize = 0;
return NULL;
}
for(int i = 0; i < strLen; ++i)
{
if(S[i] == C)
{
res[i] = 0;
}
else
{
int min = strLen;
for(int j = 0; j < count; ++j)
{
if((i -pTmpArray[j]) > 0)
{
min = min < (i - pTmpArray[j]) ? min : (i - pTmpArray[j]);
}
else
{
min = min < (pTmpArray[j] - i) ? min : (pTmpArray[j] - i);
}
}
res[i] = min;
}
}
*returnSize = strLen;
free(pTmpArray);
pTmpArray = NULL;
return res;
}