题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 2 2 2 行。
第 1 1 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 2 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 0 0 开始);如果单词在文章中没有出现,则直接输出一个整数 − 1 -1 −1。
注意:空格占一个字母位
样例 #1
样例输入 #1
To
to be or not to be is a question
样例输出 #1
2 0
样例 #2
样例输入 #2
to
Did the Ottoman Empire lose its power at that time
样例输出 #2
-1
提示
数据范围
1 ≤ 1\leq 1≤ 第一行单词长度 ≤ 10 \leq10 ≤10。
1 ≤ 1\leq 1≤ 文章长度 ≤ 1 0 6 \leq10^6 ≤106。
noip2011 普及组第 2 题
解题思路:
初次学编程碰到这道题手足无措写下了188行丑陋代码离奇AC,时隔一年再次尝试。
主要用到java的分割函数,将第二串单词切割封装在字符串数组里,将第一串中的单词分别与上述字符串数组分别比对,这里用到Java的字符串比较函数,记录第一次比对成功的数组下标,用number变量记录比成功的总数
为了方便对比,手动写一个函数,将两着的单词都转换为大写
查第一次出现对比成功单词的首字母下标有点难度,这里写一个FindIndex函数,已经明确两个单词之间有空格做分隔,那么可以用两个变量,分别记录第一个单词出现的位置,第二个变量用来更新正在遍历的是第几个单词若遍历到空格就更新第二个变量,若第二个变量与上述记录的第一次对比成功的数组下标相同,那么此时可直接返回第一个变量,此变量所在位置即第一次匹配成功的单词第一个字母所在位置
需要注意的是“ aa bb”字符串用分割函数操作字符串数组中下标为1内部装的是aa单词,下标0内部装入的是空格
时间复杂度不超过10 ^ 6 * 10 = 10 ^ 7
简洁代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String sample = sc.nextLine();
String article = sc.nextLine();
String book[] = article.split("\\s+"); // 防止两单词之间有多个空格
System.out.print(Check(book, sample, article));
}
public static String Check(String book[], String sample, String article) {
int flag = -1; // 标志是否出现
int number = 0;
sample = BigWrite(sample);
for(int i = 0; i < book.length; i ++) { // 10 ^ 6
book[i] = BigWrite(book[i]);
if(book[i].equals(sample)) { // 10
number ++;
if(flag == -1) {
flag = FindIndex(i, article);
}
}
}
return flag == -1 ? -1 + "" : number + " " + flag;
}
public static String BigWrite(String sample) {
String res = "";
for(char a : sample.toCharArray()) {
if(a >= 'a' && a <= 'z') {
a = (char)(a - 32);
res = res + a;
}else
res = res + a;
}
return res;
}
public static int FindIndex(int i, String article) {
char arr[] = article.toCharArray();
int index = 0; //记录真实下标号
int ps = 0; // 查单词位置
while(arr[index] == ' ') {
index ++; // 防止开头都是空格
}
ps = index == 0 ? 0 : 1;
while(true) {
if(arr[index] == ' ') { //遇到空格
while(arr[index] == ' ') index ++;
ps ++; // 单词位置更新
}
if(ps == i) return index;
index ++;
}
}
}
丑陋代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s1=sc.next();
String s2=sc.nextLine();
String s3=sc.nextLine();
/* String s4[]=s3.split(" ");
String s5="";
for(int j=0;j<s4.length;j++)
{
s5=s5+s4[j];
}
char s6[]=s5.toCharArray();*/
char s6[]=s3.toCharArray();
char s7[]=s1.toCharArray();
int sum=0;
int wei=0;
int zhi=0;
if(s7.length==1)
{
for(int i=0;i<s6.length;i++)
{
if(s7[0]>='a'&&s7[0]<='z')
{
if(s7[0]==s6[i]||(char)(s7[0]-32)==s6[i])
{ if(i==0)
{
if( (s6[i+1]==' '||(i+1)>=s6.length))
{wei=i;
sum++;}
}
else
{
if(s6[i-1]==' '&&(s6[i+1]==' '||(i+1)>=s6.length))
{wei=i;
sum++;}
}
}
/* else if(s7[0]==s6[i]||(char)(s7[0]-32)==s6[i])
{ wei=i;
sum++;
}*/
}
else if(s7[0]>='A'&&s7[0]<='Z')
{
if(s7[0]==s6[i]||(char)(s7[0]+32)==s6[i])
{ if(i==0)
{
if( (s6[i+1]==' '||(i+1)>=s6.length))
{wei=i;
sum++;}
}
else
{ if(s6[i-1]==' '&&(s6[i+1]==' '||(i+1)>=s6.length))
{
{wei=i;
sum++;}
}
}
}
/*else if(s7[0]==s6[i]||(char)(s7[0]+32)==s6[i])
{ wei=i;
sum++;
}*/
}
if(sum==1)
zhi=wei;
}
}
else{
for(int i=0;i<s6.length;i++)
{ int flag=0,flg=1;int c=1;
if(s7[0]>='a'&&s7[0]<='z')
{
if(s7[0]==s6[i]||(char)(s7[0]-32)==s6[i])
if((i==0&&(s6[s7.length]==' '||s6.length==s7.length))||(i>0&&(s6[i-1]==' '&&(s6[i+s7.length]==' '||s6.length==i+s7.length))))
{ wei=i;
int h=i+1;
if(h>=s6.length)
{
if(s7.length==1)
{sum++;
break;
}
else
break;
}
for(int k=1;k<s7.length;k++)
{ flag++;
if(c==0)
{flg =0;break;}
if(s7[k]>='a'&&s7[k]<='z')
{
if(s7[k]!=s6[h]&&(char)(s7[k]-32)!=s6[h])
{
flg=0;
}
}
else if(s7[k]>='A'&&s7[k]<='Z')
{
if(s7[k]!=s6[h]&&(char)(s7[k]+32)!=s6[h])
{
flg=0;
}
}
h++;
if(h>=s6.length&&(k+1)<s7.length)
{
c=0;
}
}
}
}
else if(s7[0]>='A'&&s7[0]<='Z')
{ wei=i;
if(s7[0]==s6[i]||(char)(s7[0]+32)==s6[i])
if((i==0&&(s6[s7.length]==' '||s6.length==s7.length))||(i>0&&(s6[i-1]==' '&&(s6[i+s7.length]==' '||s6.length==i+s7.length))))
{
int h=i+1;
if(h>=s6.length)
{
if(s7.length==1)
{sum++;
break;
}
else
break;
}
for(int k=1;k<s7.length;k++)
{ flag++;
if(c==0)
{flg =0;break;}
if(s7[k]>='a'&&s7[k]<='z')
{
if(s7[k]!=s6[h]&&(char)(s7[k]-32)!=s6[h])
{
flg=0;
}
}
else if(s7[k]>='A'&&s7[k]<='Z')
{
if(s7[k]!=s6[h]&&(char)(s7[k]+32)!=s6[h])
{
flg=0;
}
}
h++;
if(h>=s6.length&&(k+1)<s7.length)
{
c=0;
}
}
}
}
if(flag!=0&&flg!=0)
{ sum++;
if(sum==1)
zhi=wei;
}
}
}
if(sum==0)
{
System.out.print("-1");
}
else
{
System.out.printf("%d %d",sum,zhi);
}
}
}
没啥好说的纯 if else