EOJ 3018 查找单词 个人错误分析


3018. 查找单词

单点时限: 2.0 sec

内存限制: 256 MB

有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连续的空格。

查找单词时,不区分大小写,但要求完全匹配,即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。

输入格式

第 1 行:一个整数 T (1≤T≤10) 为问题数。

接下来共 2T 行,对应每个问题有 2 行,表示 W 和 S (长度长度1≤W长度≤10;1≤S长度≤1000000)。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出 IDX。
S 中没有找到 W 时输出 None

样例

input
3
IN
Find a word within a string in English and in Chinese.
to
    Find a word within a string in English and in Chinese.
In
    Find a word within a string in English and in Chinese.
output
case #0:
29
case #1:
None
case #2:
33

我的提交

#include 
using namespace std;

int main()
{
    int t, i = 0, j, ret = 0;
    scanf("%d", &t);
    getchar();
    string w, s;
    while (t--)
    {

        getline(cin, w);
        getline(cin, s);//输入选它就对了
        transform(s.begin(), s.end(), s.begin(), ::toupper);
        transform(w.begin(), w.end(), w.begin(), ::toupper);//一种有趣的大小写转换写法
        s += " ";//尾插一个空格,方便查找
        if (s.find(w + " ") == 0)//利用string模板函数快速寻找,此处判断首单词
            cout << "case #" << ret++ << ":" << endl
                 << 1 << endl;
        else if (s.find(" " + w + " ") != -1)//判断句中单词
        {

            cout << "case #" << ret++ << ":" << endl
                 << s.find(" " + w + " ") + 2 << endl;//因为查照从0开始,并且`有前置空格,故+2
        }
        else
            cout << "case #" << ret++ << ":" << endl
                 << "None" << endl;
    }
    return 0;
}
//ps:如果添加" "+w查找属于没理解到关键,不加前后空格则查找会截断单词
 

相关