UESTCOJ158 论文搜索

题目
论文查找
UESTCOJ158 论文搜索_第1张图片
这道题…我一度认为我已经写不出来了,硬着头皮改代码,RE其七次,WA一次,第九次提交终于AC…
让人感觉扔上 O J OJ OJ平台之后结果让我感觉扑朔迷离,红色的反馈发出耀眼的光芒!
UESTCOJ158 论文搜索_第2张图片

直接上代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,N,i,j,cnt,ans;
	string words;//文章字符串
    string find;//寻找的单词
	cin>>T;
	while(T--){
		ans=0;
    	cin>>N;
    	getchar();//消耗换行符
    	getline(cin,find);//读入文章内容
    	bool flag2=1;//记录查找字段是否比论文名还长
    	while(N--){	
			bool flag = 0;//标记能否找到目标字符串 而不关心有多少个(也可计数)	
    		getline(cin,words);  
    		//printf("wordlen%d\n",words.length());
    		if(words.length()<find.length()){
    			flag2=0; continue;//不是用break哦,后面的还需要继续搜索
			}
			//核心搜索算法如下
			for(i=0;i<=words.length()-find.length();i++){
				flag2=1;
        		for(j=0;j<find.length();j++){
        			if(i==0){//防止下标i-1越界
						if(words[i+j]!=find[j]) break;
					}else if(i+j==words.length()){//防止下标i+j越界
						if (words[i-1]!=' ') break;
					}else if(words[i+j]!=find[j]||words[i-1]!=' ') break;       			
            	}
            	//printf("i+j=%d\n",i+j); 测试越界值,发现是卡在边界上的,需要特判
            	if(i+j==words.length()){
            		if((j==find.length())&&(i+j==words.length())) flag=1;   
				}else if((j==find.length())&&(words[j+i]==' ')) flag=1;           		
    		}
    		if(flag) ans++;//这组的答案自增
   	    }
   	    if(flag2==0) printf("Do not find\n");//每个论文名都比目标串短
    	else if(ans==0){
        	printf("Do not find\n");
    	}else{
        	printf("%d\n",ans);
    	}   
		printf("\n");	    
	}
    return 0;
}

UESTCOJ158 论文搜索_第3张图片


吾日三省吾身 下面的内容才是关键咯:

  • s t r i n g string string中,对下标要求很严格!下标不要到 s t r . l e n g t h ( ) str.length() str.length(),会 R u n t i m e E r r o r Runtime Error RuntimeError
  • 解决下标的问题费了很多心思, i − 1 i-1 i1为负, i + j i+j i+j为边界的时候都需要特殊判定一次,要对判断结构熟悉
  • c i n cin cin后需要接 g e t c h a r ( ) getchar() getchar再接 g e t l i n e getline getline,防止换行符读入字符串中
  • 考虑查找字符串比查找对象还短的情况,用判断结构的话,战线太长(花括号囊括的代码量太大)所以选择用 f l a g flag flag打标记无疑应该是首选了
  • c o n t i n u e 、 b r e a k continue、break continuebreak考虑清楚,退出哪层循环了?后续还需要进行判定吗?
  • 这道题又是测试T次,又是每轮输入N个测试数据,所以思维不能乱,注意每轮只输出一个结果,在 w h i l e ( N − − ) while(N--) whileN中只是运算并记录,并没有输出东西
  • 变量的位置很重要!比如 f l a g flag flag是用来记录能否在长串中找到短串,如果是1则ans++,这个变量放在每轮 w h i l e ( N − − ) while(N--) whileN中进行初始化!而 f l a g 2 flag2 flag2则不同了,它放在进入这个循环前!全面把控这N个测试的字符串有没有比查找串短
  • 搜索算法参考我的另一篇题解:字符中的单词查询
  • 因为核心算法写过,这里就没过多解释,详见上一条(所以这条是废话
  • 这种题需要亲自再多写一写,实践出真知!

你可能感兴趣的:(字符串算法)