IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 人物相关性JavaB组(滑动窗口解决) -> 正文阅读

[数据结构与算法]人物相关性JavaB组(滑动窗口解决)

小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。

更准确的说,小明定义 Alice 和 Bob “同时出现” 的意思是:在小说文本 中 Alice 和 Bob 之间不超过 KK 个字符。

例如以下文本:

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(1 <= K <= 1e6)。

第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 1e6。

输出描述

输出一个整数,表示 Alice 和 Bob 同时出现的次数。

示例

输入:

20

This is a story about Alice and Bob.Alice wants to send a private message to Bob.

输出:

2

思路:

  • 对于每一个出现的Alice或Bob,用一个数组nums存储,nums[0]表示起始字符,nums[1]表示结束字符。所有的Alice按起始字符从小到大存储在列表list1中,Bob按起始字符从小到大存储到列表list2中。
  • 第一想法是遍历每一个Alice,判断[nums[0] - k, nums[0] - 1]中和[nums[1] + 1, nums[1] + k]中有多少个Bob再加到最终的答案中。这是一个很朴素的想法,同时也是可以通过80%的样例的。但相信读者应该和我一样有这样的想法,假如Alice1号出现在Alice2号之间,那么Alice1的左边访问不到的Bob,Alice2肯定也访问不到,同时Alice2还可以访问到比Alice1更右边的Bob,但不知道该如何用代码表达。是定义临时变量,还是?经过看其他博客的提示,咋一看,随着list1的遍历,能访问的到Bob的左边界往左移,右边界往右移,还满足一定的限制,这是不是正符合滑动窗口的定义吗,附AC代码。
import java.util.*;
public class 人物相关性 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int k = in.nextInt();
		in.nextLine();
		String s = in.nextLine();
		int idx = 0;
		List<int[]> list1 = new ArrayList<int[]>(), list2 = new ArrayList<int[]>();
		while (idx != -1) {
			idx = s.indexOf("Alice", idx);
			if (idx == -1) {
				break;
			}
			// System.out.println(idx);
			if (idx - 1 >= 0 && Character.isLetter(s.charAt(idx - 1)) || idx + 4 < s.length() && Character.isLetter(s.charAt(idx +5))) {
				idx += 5;
				continue;
			}
			list1.add(new int[] {idx, idx + 4});
			idx += 5;
		}
		idx = 0;
		while (idx != -1) {
			idx = s.indexOf("Bob", idx);
			if (idx == -1) {
				break;
			}
			if (idx - 1 >= 0 && Character.isLetter(s.charAt(idx - 1)) || idx + 3 < s.length() && Character.isLetter(s.charAt(idx +3))) {
				// System.out.println(true + " " + s.charAt(idx - 1) + " " + s.charAt(idx + 3));
				idx += 3;
				continue;
			}
			list2.add(new int[] {idx, idx + 2});
			idx += 3;
		}
		long ans = 0;
		int l = 0, r = 0;
		for (int i = 0; i < list1.size(); i++) {
			while (l < list2.size() && list2.get(l)[1] < list1.get(i)[0] - k) {
				l++;
			}
			while (r < list2.size() && list2.get(r)[0] <= list1.get(i)[1] + k) {
				r++;
			}
			ans += r - l;
		}
		System.out.println(ans);
	}
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:27:37  更:2022-04-06 23:30:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:34:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码