【问题描述】
小明正在分析
一
本小说中的人物相关性。他想知道在小说中 Alice 和 Bob
有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob
“
同时出现
”
的意思是:在小说文本
中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
假设 K
=
20,则 Alice 和 Bob 同时出现了 2 次,分别是
”
Alice and Bob
”
和
”
Bob. Alice
”
。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能
有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第
一
行包含
一
个整数 K。
第二行包含
一
行字符串,只包含大小写字母、标点符号和空格。长度不超
过 1000000。
【输出格式】
输出
一
个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
试题H: 人物相关性分析 12第十届蓝桥杯大赛软件类省赛 Java 大学 B 组
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ K ≤ 1000000。
importjava.util.List;importjava.util.ArrayList;importjava.util.Scanner;importjavax.swing.text.DefaultEditorKit.InsertBreakAction;public classMain
{static List list = new ArrayList();//用来保存分割后的字符串
static List art = new ArrayList<>();//记录.出现的位置
static int number = 0;public static voidprint()
{for(String b:list)
{
System.out.println(b);
}
}public static voidfun(String string)
{int count = 0;char crt[] = string.toCharArray();//将字符串转为字符数组
for(charb:crt)
{if(b == ‘ ‘)
count++;else if(b == ‘.‘)
{
art.add(count);
count++;
}
}
}public static void insert()//将‘.‘插入到list中。
{int sum = 0;for(inti:art)
{
sum++;
list.add(i+sum,".");//将指定的元素添加到指定的位置
}
}public static void lon(List list2,int k)//判断两个之间长度是否小于k
{int lonK = 0;for(String str1:list2)
{
lonK+=str1.length();
}if(lonK<=k)
{
number++;
}
}public static void ifmanzu(int k)//判断是否满组条件的个数
{//list.sublList(0,3)//将字符串的0到3,取出来
int begin = 0;
List list1 =list.subList(begin, list.size());while(true)
{//System.out.println(list1);
int a1 = list1.indexOf("Alice");//找出列表中Allice 第一次出现的位置
int b1 = list1.indexOf("Bob");//找到列表中Bob第一次出现的位置
if(a1==-1||b1==-1)//没有同时出现的了
{break;
}if(a1
{
lon(list1.subList(a1+1, b1), k);
list1.remove(a1);//移除
}else{
lon(list1.subList(b1+1, a1), k);
list1.remove(b1);
}
}
}public static voidmain(String[] args)
{//TODO Auto-generated method stub
Scanner scanner = newScanner(System.in);int k =scanner.nextInt();
Scanner scanner1= newScanner(System.in);
String string=scanner1.nextLine();
fun(string);//String [] a = string.split("\\s+");//按空格截取
String [] a = string.split("[ \\.]");for(String b:a)
{
list.add(b);
}
insert();//将‘.‘插入到list中
ifmanzu(k);
System.out.println(number);//System.out.println(art);
}
}
原文:https://www.cnblogs.com/zkw123/p/11966930.html