题目描述
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
20 This is a story about Alice and Bob.Alice wants
to send aprivate 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 aprivate message to Bob.
【样例输出】
2
package Demo03_23;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Demo_01 {
static char[] cha;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//接收k
int k = sc.nextInt();
//接受字符串
String string = sc.nextLine();
//将字符串转化为字符数组方便遍历
cha = string.toCharArray();
//存储名字的起始位置
ArrayList<Integer> temp = new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
//计数
int count = 0;
int[][] store;//先声明
//
for (int i = 0; i < cha.length; i++) {
if (cha[i] == ' ' || cha[i] == ',' || cha[i] == '.') {
list.add(i);
}
}
// System.out.println(list);
//有问题
//检测第一个位置是否满足要求
for (int i = 0; i < list.size(); i++) {
if (i == 0 && (list.get(i) == 3 || list.get(i) == 5)) {
if (check(list.get(i), string) != 0) {
temp.add(0);
temp.add(check(list.get(i), string));
}
}else if(i >= 1) {
//检测第一个位置以后是否满足要求
if (list.get(i) - list.get(i-1)-1 == 3 || list.get(i) - list.get(i-1)-1 == 5) {
// System.out.println(list.get(i));
if (check(list.get(i-1), list.get(i),string) != 0) {
temp.add(list.get(i)-1);
temp.add(check(list.get(i-1), list.get(i), string));
}
}
}
}
// System.out.println(temp);
store = new int[temp.size() / 2][2];
//将临时存储中的值,转移到store中(一维转二维)
for (int i = 0; i < store.length; i++) {
store[i][0] = temp.get(2*i);
store[i][1] = temp.get(2*i + 1);
// System.out.println(Arrays.toString(store[i]));
}
//找相邻位置Alice和Bob的个数
for (int i = 0; i < store.length - 1; i++) {
for (int j = i+1; j < store.length; j++) {
if (store[j][0] - store[i][0] <= k) {
if ((store[i][1] == 1 && store[j][1] == 2) || store[i][1] == 2 && store[j][1] == 1) {
count++;
}
}else {
break;
}
}
}
// System.out.println(store.length);
System.out.println(count);
sc.close();
}
//i为前一项,j为后一项
private static int check(int i, int j, String string) {
char[] aliceString = "Alice".toCharArray();
char[] bobString = "Bob".toCharArray();
if (j - i-1 == 3) {
for (int m = 0, n = i+1; m < bobString.length;m++, n++) {
if (bobString[m] != cha[n]) {
return 0;
}
}
return 1;
}
if (j - i-1 == 5) {
for (int m = 0, n = i+1; m < bobString.length;m++, n++) {
if (aliceString[m] != cha[n]) {
return 0;
}
}
return 2;
}
return 0;
}
//当位置是1时的重载方法
private static int check(int j, String string) {
char[] aliceString = "Alice".toCharArray();
char[] bobString = "Bob".toCharArray();
if (j == 3) {
for (int i = 0; i < bobString.length; i++) {
if (cha[i] != bobString[i]) {
return 0;
}
}
return 1;
}
if (j == 5) {
for (int i = 0; i < aliceString.length; i++) {
if (cha[i] != aliceString[i]) {
return 0;
}
}
return 2;
}
return 0;
}
}