luogu_P1308 字符中的单词查询

luogu_P1308 字符中的单词查询_第1张图片
这道题困了我一天…以下是我的代码(解析见注释)

#include
using namespace std;
int main()
{
    string words;//文章字符串
    string find;//寻找的单词
    int i,j,cnt=0,firstp;
    getline(cin,find);//读入文章内容
    getline(cin,words);//读入寻找单词
    
    for(i=0;i<words.length();i++)
    {
        if(!islower(words[i]))//将words的大写全部转化为小写字母
        {
            words[i]=tolower(words[i]);
        }
    }
    for(i=0;i<find.length();i++)
    {
        if(!islower(find[i]))//将find的大写全部转化为小写字母
        {
            find[i]=tolower(find[i]);
        }
    }
    
    for(i=0;i<=words.length()-find.length();i++)
    //为什么需要字符串长度相减?后面代码中words[i+j]的目的就是对应着find往后推j位
    //所以说,最后的几位(长度差)不需要再遍历了(已经搜索完整了)
    {
        for(j=0;j<find.length();j++)
        {
            if(words[i+j]!=find[j]) break;//判断是遇到和find()不同的就退出循环
            //if(i>0&&words[i-1]!=' ') break;//逐位搜索就不用这步前空格判断了
        }
        //注意!退出j的循环时j+1了一次,后面用j的时候全部需要小心!!!卡卡卡!
        if((j==find.length())&&(words[j+i]==' '||i+j==words.length()))
        {
            cnt++;
            if(cnt==1) firstp=i;//记录第一次出现单词的第一位字母占位
        }
    }
    
    if(cnt==0)//输出结果
    {
        cout<<-1;
    }else{
        cout<<cnt<<" "<<firstp;
    }
    return 0;
}

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