欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UESTCOJ158 论文搜索

程序员文章站 2022-05-01 14:27:32
...

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

直接上代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,N,i,j,cnt,ans;
	string words;//文章字符串
    string find;//寻找的单词
	cin>>T;
	while(T--){//T次测试数据
		ans=0;//这个是输出的答案
    	cin>>N;
    	getchar();//一定要吸收换行符!
    	getline(cin,find);//读入查找内容
    	bool flag2=1;//如果查找的比文章短为1,反之为0
    	while(N--){	
			bool flag = 0;//标记有无这个查找字符串(而不关心有几个	
    		getline(cin,words);  
    		printf("len_words=%d\n",words.length())
    		if(words.length()<find.length()){
    			flag2=0; continue;
    			//如果查找的长,那么这个对象不成立,用continue进入下一次判断,而不是break直接退出,退出了如果后面的满足呢
			}
			for(i=0;i<=words.length()-find.length();i++){
				flag2=1;//满足查找的短就让flag2=1
        		for(j=0;j<find.length();j++){
        		//这里开始要小心了!!!为啥RE???下标i+j不能到length!i-1不能小于0!
        			if(i==0){//i、第一项i=0时,i-1为-1,下标越下界!局部判断即可
						if(words[i+j]!=find[j]) break;
					}else if(i+j==words.length()){//i+j==words.length(),下标越上界!
						if (words[i-1]!=' ') break;
					}else if(words[i+j]!=find[j]||words[i-1]!=' ') break;//中间不越界部分完整判断       			
            	}
            	//printf("i+j=%d\n",i+j);测试下标越界到哪里的,发现刚好卡在words.length()
            	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++;//答案+1
   	    }
   	    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;
}

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

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