首页 > 其他分享 >识别单词 —— Openjudge [NOIP2011]统计单词数

识别单词 —— Openjudge [NOIP2011]统计单词数

时间:2024-03-21 19:32:35浏览次数:29  
标签:string NOIP2011 s1 单词 给定 文章 Openjudge find

题目如下:

描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中*某一单词的一部分*则不算匹配。

输入

2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出

只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。

题目明确表明:如果给定单词仅是文章中*某一单词的一部分*则不算匹配。所以把查找的单词直接塞入find()是不可取的。

思考单词的特点:一般的单词在文本中单词的前后为空格。考虑首尾情况:在母串的前后加入空格以将该情况一般化。同时在需要识别的单词前后加入空格,如此便可以使用find()。

其次要不区分大小写:使用toupper并结合transform函数将所有小写字母转换为大写字母:(转换为小写字母为tolower)。

void string_toUpper(string& s1){
    transform(s1.begin(),s1.end(),s1.begin(),[](char c){
    return toupper(c);
    });
}

同时我们需要注意:find()返回找到的第一个子串开头字母在母串的索引,所以只用find()找到所有子串并计数不现实,利用substr()把找到的第一个字串和之前的部分截掉之后继续识别即可。

        if(o.find(s) != std::string::npos){
            if(count == 0){
                firstfind = o.find(s);
            }
            count++;
            o = o.substr(o.find(s)+s.size()-1,o.size()-s.size()+2-o.find(s));
        }

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
void string_toUpper(string& s1){
    transform(s1.begin(),s1.end(),s1.begin(),[](char c){
    return toupper(c);
    });
}

int main(){
    string s,o;
    getline(cin,s);
    getline(cin,o);
    string_toUpper(s);
    string_toUpper(o);
    int count = 0;
    o = " " + o + " ";
    s = " " + s + " ";
    int firstfind;
    bool finding = true;
    while(finding){
        finding = false;
        if(o.find(s) != std::string::npos){
            if(count == 0){
                firstfind = o.find(s);
            }
            count++;
            o = o.substr(o.find(s)+s.size()-1,o.size()-s.size()+2-o.find(s));
            finding = true;
        }
    }
    if(count == 0)cout << -1;
    else cout << count << " " << firstfind;
    return 0;
}

注:string::npos是一个很大的数字,在find()函数未找到符合条件的数字时返回该值。

string::npos == 0xffffffffffffffff

感谢你能看到这里。

标签:string,NOIP2011,s1,单词,给定,文章,Openjudge,find
From: https://blog.csdn.net/q1557137513/article/details/136916899

相关文章

  • 复试C++16真题_程序设计1_输出句子中每个单词长度
    输入一行文本,按照相应格式输出每个单词的长度#include<iostream>usingnamespacestd;#include<string>#include<vector>#include<iomanip>intmain(){stringsen="qweasdaxszfsfsddwfas";//getline(cin,sen);如果要把输入的空格的记录......
  • 139. 单词拆分
    给你一个字符串s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。题解主要分类:动态规划思路:这题的要点在于如何使用动态规划。这是打死我也想不......
  • Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
    Java如何相加两个数字相加两个数字示例intx=5;inty=6;intsum=x+y;System.out.println(sum);//打印x+y的和输出11解释首先,声明两个int类型的变量x和y,并分别赋值为5和6。然后,使用+运算符将x和y相加,并将结果赋给变量sum。最后,使用Sy......
  • NPL---自然语言处理单词界定问题
    2.1单词界定问题单词定界问题是属于词法层面的消歧任务。在口语中,词与词之间通常是连贯说出来的。在书面语中,中文等语言也没有词与词之间的边界。由于单词是承载语义的最小单元,要解决自然语言处理,单词的边界界定问题首当其冲。特别是中文文本通常由连续的字序列组成,词与词之间缺......
  • 杭电OJ 2072-单词数
    单词数因为新学了散列表容器map,这道题只用统计不同单词的总数,用映射再统计个数蛮合适,学以致用doge,需要注意文章开头可能有空格,最后要把空格这一映射减掉。AC代码:#include<iostream>#include<cstdio>#include<map>#include<string>usingnamespacestd;map<string,......
  • 政安晨:【深度学习处理实践】(八)—— 表示单词组的两种方法:集合和序列
    咱们接着这个系列的上一篇文章继续:政安晨:【深度学习处理实践】(七)——文本数据预处理https://blog.csdn.net/snowdenkeke/article/details/136697057机器学习模型如何表示单个单词,这是一个相对没有争议的问题:它是分类特征(来自预定义集合的值),我们知道如何处理。它应该被编码......
  • 代码随想录算法训练营第七天|LeetCode 344.反转字符串、541.反转字符串II、卡码网54.替
    344.反转字符串题目描述:​编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用O(1)的额外空间解决这一问题。示例一:输入:s=["h","e","l","l","o"]输出:["o","l","l......
  • 代码随想录算法训练营第day46|139.单词拆分 、多重背包
    目录139.单词拆分多重背包 139.单词拆分力扣题目链接(opensnewwindow)给定一个非空字符串s和一个包含非空单词的列表wordDict,判定 s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单......
  • 代码随想录算法训练营第四十六天| 139.单词拆分 多重背包 背包问题总结篇!
    单词拆分 题目链接:139.单词拆分-力扣(LeetCode)思路:竟然真能转化为背包问题。classSolution{public:boolwordBreak(strings,vector<string>&wordDict){unordered_set<string>t(wordDict.begin(),wordDict.end());vector<bool>dp(s.size()+......
  • 代码随想录算法训练营第四十六天 | 背包问题总结篇!,关于多重背包,你该了解这些!,139.单词
    背包总结听说背包问题很难?这篇总结篇来拯救你了年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见......