【发布时间】:2019-02-06 01:25:38
【问题描述】:
给定一个 S 字符串,如果字符 C 出现在 S 的从位置 I 开始并且长度为 T 的子字符串中,则编写一个正确响应的程序。
条目
由字母数字字符组成的 S 字符串,长度最多为 1,000,000。随后是一个整数 N,后跟 N 个三元组 C、I、T。您可以假设 1≤N≤10,000 即 0≤I
退出
对于每个问题,如果字符出现在指定的子字符串中,则为 1,否则为 0。
我的想法是实现二分搜索,但合格的法官说它超出了预期的时间,我不知道如何将其优化到法官接受我的算法的程度。例如,一个条目可以是:
how are you
3
h 0 3
1
o 2 5
1
a 4 4
0
我的代码:
#include <stdio.h>
#include <string.h>
int busqcadena(char cadena[], int a[],char x,int pos,int n);
int main()
{
char cadena[1000000];
char c;
int t = 0, i;
int pos, lon, a[1000000], j = 0;
do{
fflush(stdin);
c = getchar();
cadena[i++] = c;
a[j] = j;
j++;
} while (c != '\n');
cadena[ i - 1 ] = '\0';
scanf("%d",&t);
for( int k = 0; k < t; k++){
char pa; pos = 0; lon = 0;
scanf("%s %d %d",&pa, &pos, &lon);
int busq3 = busqcadena(cadena,a,pa,pos,lon);
if( busq3 != -1){
printf("1\n");
}else{
printf("0\n");
}
}
return 0;
}
int busqcadena(char cadena[], int arr[],char x,int pos,int n){
int a = 0, b = n - 1;
while( a <= b ){
int k = (a+b)/2;
if( cadena[k] == x && arr[k] == pos){
return arr[k];
}
if( arr[k] > pos ) b = k - 1;
else a = k + 1;
}
return -1;
}
【问题讨论】:
-
您使用的是 C 还是 C++?选择一个并适当调整标签。
-
我在代码中使用 C
标签: c algorithm binary-search binary-data