NC16585 统计单词数

【题目描述】

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

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

【输入描述】

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

【输出描述】

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

 这个题是字符串匹配的问题,通常需要使用类似于双指针的指示确定来进行匹配,因此我们采用类似解法,先保证匹配的第一个字母是一个单词的首字母,如果不是就进行后移,继续寻找。

找到匹配的第一个字母后继续匹配后面的字母,直到结束匹配为止,可能是给定的单词匹配完,也可能是句子里的单词后面部分与给定单词不匹配,需要进行判断。

判断好后,然后再把找到结果进行相加,如果是第一个结果,记下它的位置,最后检查完整个句子进行输出。

#include <iostream>
#include <cstring>
#include <ctype.h>
using namespace std;

int main(){
    string f,s;
    //接收两个字符串
    getline(cin,f);
    getline(cin,s);
    int len1=f.length();
    int len2=s.length();
//     把两个字符串都转换成小写
    for(int i=0;f[i];i++){
        f[i]=tolower(f[i]);
    }
    for(int i=0;s[i];i++){
        s[i]=tolower(s[i]);
    }
    
    
    
    int pos,ans=0,count=0;
    for(int i=0;i<len2;i++){
        
        if(s[i]==f[0]){
//             如果第一个字母匹配的位置不是一个单词的首字母,就把继续向后寻找
            if(s[i-1]>='a'&&s[i-1]<='z'){
                while(s[i]>='a'&&s[i]<='z'){
                    i++;
                }
            }
//             开始匹配
            int n=i,m=0;
            if(s[n]==f[m]){
                while(s[n]==f[m]&&f[m]){
                    m++;
                    n++;
                }
            }
//             结束匹配
//             判断是那个原因导致匹配结束
            int fff=(f[m])?0:1;
            if(fff){
                if(s[n]!=' '&&s[n]!='\0') continue;
                if(ans==0){
                    pos=i;
                }
                ans++;
                i+=len1;
            }
        }
    }
    if(ans==0){
        cout<<-1;
    }else{
        cout<<ans<<" "<<pos;
    }
    return 0;
}

统计单词数类似于字符串匹配,使用java语言有先天优势。Java含有的split函数和equal非常方便。

import java.util.Scanner;

public class Main{
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        String word=sc.nextLine().toLowerCase();
        String sentence=sc.nextLine().toLowerCase();
        String []words=sentence.split(" ");
        int pos=0,ans=0,start=0;
        for(int i=0;i<words.length;i++){
            if(word.equals(words[i])){
                if(ans==0) start=pos;
                ans++;
            }
            pos+=words[i].length()+1;
        }
        if(ans==0){
            System.out.println("-1");
        }
        else{
            System.out.println(ans+" "+start);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值