UESTCOJ158 论文搜索
程序员文章站
2022-05-01 14:27:32
...
题目
论文查找
这道题…我一度认为我已经写不出来了,硬着头皮改代码,RE其七次,WA一次,第九次提交终于AC…
让人感觉扔上平台之后结果让我感觉扑朔迷离,红色的反馈发出耀眼的光芒!
直接上代码
#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;
}
吾日三省吾身 下面的内容才是关键咯:
- 在中,对下标要求很严格!下标不要到,会
- 解决下标的问题费了很多心思,为负,为边界的时候都需要特殊判定一次,要对判断结构熟悉
- 后需要接再接,防止换行符读入字符串中
- 考虑查找字符串比查找对象还短的情况,用判断结构的话,战线太长(花括号囊括的代码量太大)所以选择用打标记无疑应该是首选了
- 考虑清楚,退出哪层循环了?后续还需要进行判定吗?
- 这道题又是测试T次,又是每轮输入N个测试数据,所以思维不能乱,注意每轮只输出一个结果,在中只是运算并记录,并没有输出东西
- 变量的位置很重要!比如是用来记录能否在长串中找到短串,如果是1则ans++,这个变量放在每轮中进行初始化!而则不同了,它放在进入这个循环前!全面把控这N个测试的字符串有没有比查找串短
- 搜索算法参考我的另一篇题解:字符中的单词查询
因为核心算法写过,这里就没过多解释,详见上一条(所以这条是废话- 这种题需要亲自再多写一写,实践出真知!
上一篇: 来自前辈的教导