题目不难,关键在于空格和字符 . 需要对其进行转义(一道让我疑惑半天的题目)!可能是对正则表达式这方面之前接触的比较少把,做题的时候没有这个意识。以后要增强此方面的意识和能力。加油!
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中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 个字符。
注意:
Alice 和Bob 是大小写敏感的,alice 或bob 等并不计算在内。
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.
【样例输出】
2
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
sc.nextLine();
String sb = sc.nextLine();
sc.close();
String[] str=sb.split("\\s+|\\.");
int flag=0,pre=-1,ans=0;
for(int i=0;i<str.length;i++) {
if(str[i].equals("Alice")||str[i].equals("Bob")) {
if(flag==0) {
flag=str[i].equals("Alice")?1:2;
pre=i;
}else if((flag==1&&str[i].equals("Alice"))||(flag==2&&str[i].equals("Bob"))) {
pre=i;
}else {
if(i-pre-1<=k) {
int count=0;
for(int j=pre+1;j<i;j++) {
count+=str[j].length()!=0?str[j].length():1;
}
count+=i-pre;
if(count<=k)ans++;
pre=i;
flag=str[i].equals("Alice")?1:2;
}
}
}
}
System.out.println(ans);
}
}