4 条题解

  • 0
    @ 2025-9-28 11:14:55

    我之前没有学过字符串的相关知识,我是一边做题一边看书学出来。所以我觉得我的题解应该可以给像我一样的新手看,给予参考或者启发。 我的思路是,被匹配的字符串的每个字符都去匹配要匹配的字符串的字符,如果匹配到了,就标记被占用。核心思路是这个,然后配上辅助减少计算时间的方法就行了。应该会有更快的算法,但我想了很久想不出来。 下面的代码要用到的没教过的函数(目前)是strlen() (这个函数是我从课本扒出来的,需要<string.h>头文件),这个函数是求字符串长度的。然后其它的都是些课上讲的东西组合起来和我发现的一些小点。

    #include <stdio.h>
    #include <string.h>
    
    int get_times(char main_str[], char sub_str[]) {
    	int main_length = strlen(main_str);
    	int sub_length = strlen(sub_str);
    	int times = 0;
    	// 遍历主串
    	int start = 0;
    	int end = 0;
    	for (int i = 0; i < main_length; i ++) {
    		int match_array[15] = {0};
    		end = i;
    		
    		if ((end - start) == sub_length) {
    			start += 1;
    		}
    		
    		int match_times = 0;
    		for (int j = start; j <= end; j ++) {
    			for (int k = 0; k < sub_length; k ++) {
    				if (main_str[j] == sub_str[k] && match_array[k] == 0) {
    					match_array[k] = 1;
    					match_times += 1;
    					break;
    				}
    			}
    		}
    		
    		if (match_times == sub_length) {
    			times += 1;
    		}
    	}
    	
    	return times;
    }
    
    
    int main(void) {
    	int t;
    	int qs = 0;
    	scanf("%d", &t);
    	
    	int times_array[20005] = {0};
    	int counter = -1;
    	for (int i = 0; i < t; i ++) {
    		char main_str[1005] = {0};
    		scanf("%s", main_str);
    		
    		int q;
    		scanf("%d", &q);
    		qs += q;
    		
    		for (int j = 0; j < q; j ++) {
    			counter += 1;
    			char sub_str[15] = {0};
    			scanf("%s", sub_str);
    			times_array[counter] = get_times(main_str, sub_str);
    		}
    	}
    	
    	
    	for (int i = 0; i < qs; i ++) {
    		printf("%d\n", times_array[i]);
    	}
    	
    	return 0;
    }
    

    信息

    ID
    196
    时间
    4000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    827
    已通过
    91
    上传者