【题目描述】
链接:登录—专业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);
}
}
}