题目描述:
Description
给你一个字符串 s
和一个字符 c
,且 c
是 s
中出现过的字符。
返回一个整数数组 answer
,其中 answer.length == s.length
且 answer[i]
是 s
中从下标 i
到离它 最近 的字符 c
的 距离 。
两个下标 i
和 j
之间的 距离 为 abs(i - j)
,其中 abs
是绝对值函数。
保证字符c出现在字符串s中。
ps: 若字符串s为空,应输出距离0
Input
第一行字符串长度n
第二行字符串s
第三行字符c
0<= num长度<=500
Output
返回距离数组
Sample Input
12
aobeoeeiqote
e
Sample Output
3 2 1 0 1 0 0 1 2 2 1 0
算法:
思路:
使用flag数组标记字符ch的位置
从0开始遍历下标,分别向右和向左寻找flag数组为1的位置(表示字符ch的位置),再将两个距离比较,取更小的位置
代码实现:
# include<stdio.h>
# include<math.h>
int main(){
int n;
char str[500];
char ch;
scanf("%d%s %c",&n,str,&ch);//%c前要留一个空格,防止\n吞字符
if(n==0){//0判断
printf("0\n");
return 0;
}
int flag[500]={0};//标记数组
//标记字符ch的位置
for(int i=0;i<n;i++){
if(str[i]==ch) flag[i]=1;
}
int j,len=0;
for(int i=0;i<n;i++){
j=i;len=500;
while(j<n){//向右寻找字符ch
if(flag[j]==1){
len=abs(j-i);
break;
}
j++;
}
j=i;//回到出发点
while(j>=0){//向左寻找字符ch
if(flag[j]==1){
//比较两个距离,取较小的距离
len=len>abs(j-i)?abs(j-i):len;
break;
}
j--;
}
printf("%d ",len);
}
printf("\n");
}
算法优化:
思路:
对hash的实现进行优化,用len自定义下标范围,同时hash指向值标记为位置
代码实现:
#include <stdio.h>
#include <stdlib.h>
char str[1000];
int targets[1000];
int len = 0;
int main() {
int n;
char tar;
scanf("%d", &n);
if(n == 0){
printf("%d", 0);
return 0;
}
scanf("%s", str);
scanf(" %c", &tar);
//hash
for (int i = 0; i < n; i ++) {
if (str[i] == tar) {
targets[len] = i;
len ++;
}
}
for (int i = 0; i < n; i ++) {
int tmp = 9999, idx;
for (int j = 0; j < len; j ++) {
idx = abs(targets[j] - i);
if (tmp > idx) {
tmp = idx;//取较短的距离
}
}
printf("%d ", tmp);
}
return 0;
}