题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式
共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数−1。
程序说明
以下三个代码,第一个能ac,后两个不能ac!(我也不知道为什么..但是样例能过..)
代码如下:
两个“指针” i 和 j 循环比较。
#include <iostream>
#include <cstdio>
#include <string>
#include <cctype>
using namespace std;
int main() {
int count = 0, first = 0;
string a, b;
getline(cin, a);
getline(cin, b);
int lena = a.size();
int lenb = b.size();
for(int i = 0; i < lena; i++) {
if(isupper(a[i]) != 0)
a[i] = tolower(a[i]);
}
for(int i = 0; i < lenb; i++) {
if(isupper(b[i]) != 0)
b[i] = tolower(b[i]);
}
for(int i = 0; i <= lenb - lena; i++) {
int j;
for(j = 0; j < lena; j++) {
if(a[j] != b[i+j])
break;
if(i > 0 && b[i-1] != ' ')
break;
}
if(j == lena && (b[i+j] == ' '|| i + j == lenb)) {
count++;
if(count == 1)
first = i;
}
}
if(count == 0)
cout<<-1;
else
cout<<count<<" "<<first;
return 0;
}
指针法
#include <iostream>
#include <cstdio>
#include <string>
#include <cctype>
using namespace std;
void strlower(char *a) {
for(int i = 0; i < strlen(a); i++) {
if(isupper(a[i]) != 0) {
a[i] = tolower(a[i]);
}
}
}
int main(void) {
char a[1000001], b[11], *p, *q;
int first, count = 0;
cin.getline(b, 11);
cin.getline(a, 1000001);
strlower(b);
strlower(a);
p = a;
int lena = strlen(a);
int lenb = strlen(b);
for(; q = strstr(p, b); ) {
if(q != NULL && (*(q - 1) == ' ' || q == p) && (*(q + lenb) == ' ' || (*(q + lenb) == '\0'))) {
if(count == 0) {
first = q - p;
count++;
}
else
count++;
}
else{
break;
}
p = q + lenb;
}
if(count == 0)
cout<<-1;
else
cout<<count<<" "<<first;
return 0;
}
java代码
import java.util.*;
public class Main {
public static void main(String[] args) {
int count = 0, first = 0;
Scanner sc = new Scanner(System.in);
String a = sc.nextLine().toLowerCase();
String b = sc.nextLine().toLowerCase();
b = b + " ";
String[] c = b.split(" ");
for(int i = 0; i < c.length; i++) {
if(a.equals(c[i]))
count++;
}
if(count == 0)
System.out.println(-1);
else if(a.equals(b.substring(0, a.length()))) {
first = 0;
System.out.println(count + " " + first);
}
else {
first = b.indexOf(" "+a+" ") + 1;
System.out.println(count + " " + first);
}
}
}