统计单词数(洛谷)字符串 JAVA

Thisarticledescribeshowtoprogramatexteditorfunctionthatcountsoccurrencesandfindsthefirstpositionofawordinagiventext,ignoringcaseandrequiringanexactmatch.
摘要由CSDN通过智能技术生成

题目描述

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

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

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值