当前位置: 首页 > news >正文

lintcode 1081 · 贴纸拼单词【hard 递归+记忆化搜索才能通过】

题目

https://www.lintcode.com/problem/1081/

给出N种不同类型的贴纸。 每个贴纸上都写有一个小写英文单词。
通过裁剪贴纸上的所有字母并重排序来拼出字符串target。
每种贴纸可以使用多次,假定每种贴纸数量无限。
拼出target最少需要多少张贴纸?如果不可能拼成,则返回-1。stickers的长度范围为[1, 50].
stickers仅由小写英文字母组成(没有撇号').
target的长度范围为[1, 15],而且由小写字母组成。
在所有的测试用例中,单词是从1000个最常见的美国英文单词中任意选择的,目标单词则是由两个任意单词拼接而成。
时间限制可能比以往更有挑战性,期望的时间界是平均35毫秒50个测试样例。
样例
样例 1:输入:
["with", "example", "science"], "thehat"
输出:
3
解释:
使用两张"with"和一张"example",经过裁剪和重排字母,可以得到"thehat"。这也是所需要的最少贴纸数。
样例 2:输入:
["notice", "possible"], "basicbasic"
输出:
-1
解释:
无法拼成"basicbasic"

思路

注意:单纯使用递归无法通过,需要使用递归+词频统计优化【贪心思想】+记忆化搜索才能通过
思路:每一次尝试,目标单词第一个字符在当前字符中,就以当前字符为第一个字符,去递归

参考代码

public class Solution {/*** @param stickers: a string array* @param target: a string* @return: the minimum number of stickers that you need to spell out the target*/public int minStickers(String[] stickers, String target) {//int ans = f1(stickers, target);  //直接递归,会超时//int ans = f2(stickers, target);  //优化了,使用词频表统计,还是会超时int ans = f3(stickers, target);  //优化了,使用词频表统计,加上记忆化搜索return ans == Integer.MAX_VALUE ? -1 : ans;}public static int f1(String[] stickers, String target) {if (target.length() == 0)return 0;int min = Integer.MAX_VALUE;for (String first : stickers) {String rest = minus(target, first);if (rest.length() != target.length()) {min = Math.min(min, f1(stickers, rest));}}return min + (min == Integer.MAX_VALUE ? 0 : 1);}public static String minus(String s1, String s2) {char[] str1 = s1.toCharArray();char[] str2 = s2.toCharArray();int[] cnt = new int[26];for (char c : str1) {cnt[c - 'a']++;}for (char c : str2) {cnt[c - 'a']--;}StringBuilder sb = new StringBuilder();for (int i = 0; i < 26; i++) {if (cnt[i] > 0) {for (int j = 0; j < cnt[i]; j++) {sb.append((char) (i + 'a'));}}}return sb.toString();}public static int f2(String[] stickers, String target) {int n = stickers.length;//关键优化,词频统计表int[][] cnt = new int[n][26];for (int i = 0; i < n; i++) {char[] str = stickers[i].toCharArray();for (char c : str) {cnt[i][c - 'a']++;}}int ans = process(cnt, target);return ans == Integer.MAX_VALUE ? -1 : ans;}//stickers[i] 数组,当初i号贴纸的字符统计,int[][] stickers ->所有贴纸//每一种贴纸都有无穷张//返回搞定target的最少张树//最少张数public static int process(int[][] stickers, String t) {if (t.length() == 0) return 0;char[] target = t.toCharArray();int[] tcnt = new int[26];for (char c : target) {tcnt[c - 'a']++;}int n = stickers.length;int min = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {//尝试每一张贴纸是谁int[] sticker = stickers[i];//最关键优化(剪枝,这一步也是贪心)if (sticker[target[0] - 'a'] > 0) {StringBuilder sb = new StringBuilder();for (int j = 0; j < 26; j++) {if (tcnt[j] > 0) {int nums = tcnt[j] - sticker[j];for (int k = 0; k < nums; k++) {sb.append((char) (j + 'a'));}}}String rest = sb.toString();min = Math.min(min, process(stickers, rest));}}return min + (min == Integer.MAX_VALUE ? 0 : 1);}public static int f3(String[] stickers, String target) {int n = stickers.length;int[][] cnts = new int[n][26];for (int i = 0; i < n; i++) {char[] str = stickers[i].toCharArray();for (char c : str) {cnts[i][c - 'a']++;}}Map<String, Integer> dp = new HashMap<>();dp.put("", 0);int ans = process3(cnts, target, dp);return ans == Integer.MAX_VALUE ? -1 : ans;}public static int process3(int[][] stickers,String t ,Map<String,Integer> dp){if(dp.containsKey(t))return dp.get(t);char[] target = t.toCharArray();int[] tcnt = new int[26];for (char c : target) {tcnt[c-'a']++;}int n = stickers.length;int min = Integer.MAX_VALUE;for (int i = 0; i <n ; i++) {int[] sticker = stickers[i];if(sticker[target[0]-'a'] >0){StringBuilder sb = new StringBuilder();for (int j = 0; j <26 ; j++) {if(tcnt[j] >0){int nums = tcnt[j]-sticker[j];for (int k = 0; k <nums ; k++) {sb.append((char)(j+'a'));}}}String rest = sb.toString();min = Math.min(min,process3(stickers,rest,dp));}}int ans = min+(min ==Integer.MAX_VALUE?0:1);dp.put(t,ans);return ans;}
}

相关文章:

lintcode 1081 · 贴纸拼单词【hard 递归+记忆化搜索才能通过】

题目 https://www.lintcode.com/problem/1081/ 给出N种不同类型的贴纸。 每个贴纸上都写有一个小写英文单词。 通过裁剪贴纸上的所有字母并重排序来拼出字符串target。 每种贴纸可以使用多次&#xff0c;假定每种贴纸数量无限。 拼出target最少需要多少张贴纸&#xff1f;如果…...

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)

三、拖动手势&#xff08;PanGesture&#xff09; .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件&#xff0c;滑动达到最小滑动距离&#xff08;默认值为5vp&#xff09;时拖动手势识别成功&am…...

计算机毕设之基于Python+django+MySQL可视化的学习系统的设计与实现

系统阐述的是使用可视化的学习系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。利…...

Kotlin inline、noinline、crossinline 深入解析

主要内容&#xff1a; inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的&#xff0c;inline 修饰一个函数表示该函数是一个内联函数。编译时&#xff0c;编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…...

在 CentOS 7 / RHEL 7 上安装 Python 3.11

原文链接&#xff1a;https://computingforgeeks.com/install-python-3-on-centos-rhel-7/ Python 是一种高级解释性编程语言&#xff0c;已被用于各种应用程序开发&#xff0c;并在近年来获得了巨大的流行。Python 可用于编写广泛的应用程序&#xff0c;包括 Web 开发、数据分…...

SVN基本使用笔记——广州云科

简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比&#xff0c;有什么优势 使用简单&#xff0c;上手快 目录级权限控制&#xff0c;企业安全必备 子目录Checkout&#xff0c;减少不必要的文件检出…...

python爬虫-Selenium

一、Selenium简介 Selenium是一个用于Web应用程序测试的工具&#xff0c;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。模拟浏览器功能&#xff0c;自动执行网页中的js代码&#xff0c;实现动态加载。 二、环境配置 1、查看本机电脑谷歌浏览器的版…...

flutter plugins插件【一】【FlutterJsonBeanFactory】

1、FlutterJsonBeanFactory 在Setting->Tools->FlutterJsonBeanFactory里边自定义实体类的后缀&#xff0c;默认是entity 复制json到粘贴板&#xff0c;右键自己要存放实体的目录&#xff0c;可以看到JsonToDartBeanAction Class Name是实体名字&#xff0c;会默认加上…...

系统中出现大量不可中断进程和僵尸进程(理论)

一 进程状态 当 iowait 升高时&#xff0c;进程很可能因为得不到硬件的响应&#xff0c;而长时间处于不可中断状态。从 ps 或者 top 命令的输出中&#xff0c;你可以发现它们都处于 D 状态&#xff0c;也就是不可中断状态&#xff08;Uninterruptible Sleep&#xff09;。 R …...

L1-012 计算指数(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a;本系列题使用的是“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度&#xff0c;如有需要可以直接查看对应专栏。发布个…...

String、StringBuffer、StringBuilder的区别

String、StringBuffer、StringBuilder的区别 String的内容不可修改&#xff0c;StringBuffer与StringBuilder的内容可以修改.StringBuffer与StringBuilder&#xff08;更快&#xff09;大部分功能是相似的StringBuffer采用同步处理&#xff0c;属于线程安全操作&#xff1b;而S…...

.net基础概念

1. .NET Framework .NET Framework开发平台包含公共语言运行库(CLR)和基类库(BCL)&#xff0c;前者负载管理代码的执行&#xff0c;后者提供了丰富的类库来构建应用程序。.NET Framework仅支持Windows平台 2. Mono 由于.NET Framework支支持windows环境&#xff0c;因此社区…...

电缆工厂 3D 可视化管控系统 | 智慧工厂

近年来&#xff0c;我国各类器材制造业已经开始向数字化生产转型&#xff0c;使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术&#xff0c;企业可以更好地监控生产线上的运行和质量情况&#xff0c;及时发现和解决问题&#xff0c;从而提高生产效率…...

bazel高效使用和调优

Bazel 为了正确性和高性能&#xff0c;做了很多优秀的设计&#xff0c;那么我们如何正确的使用这些能力&#xff0c;让我们的构建性能“起飞”呢&#xff0c; 我们将从本地研发和 CI pipeline 两种场景进行分析。 本地研发 本地研发通常采用默认的 Bazel 配置即可&#xff0c…...

【实训项目】传道学习助手APP设计

1.设计摘要 跨入21世纪以来,伴随着时代的飞速发展&#xff0c;国民对教育的重视度也有了进一步的提升。我们不难发现虽然很多学习内容有学习资料或者答案&#xff0c;但是这些内容并不能达到让所有求学的人对所需知识进行完全地理解与掌握。所以我们需要进行提问与求助。那么一…...

短信验证码服务

使用的是 阿里云 阿里云官网 1.找到 左上角侧边栏 -云通信 -短信服务 2.在快速学习测试处 &#xff0c;按照步骤完成快速学习&#xff0c;绑定要测试的手机号&#xff0c;选专用 【测试模板】&#xff0c;自定义模板需要人工审核&#xff0c;要一个工作日 3.右上角 获取 Acces…...

windows如何更改/禁用系统更新

提示&#xff1a;首先说明这属于将更新时间更改&#xff0c;不过你可以的将更新时间更改为十年一百年 废话不多说开始正文&#xff1a; 1.首先:winR打开运行&#xff0c;输入regedit&#xff0c;进入注册表编辑器 2.进入编辑器后依次点击&#xff1a;HKEY_LOCAL_MACHINE\SOFT…...

Clion 使用ffmpeg 学习1 开发环境配置

Clion 使用ffmpeg 学习1 开发环境配置 一、准备工作1. 准备环境2. 下载FFmpeg 二、操作步骤1. Clion 新建一个C项目2. 修改 CMakeLists.txt3. 修改配置4. 运行测试5. 打印rtsp 流信息的 demo 一、准备工作 在视频处理和多媒体应用程序开发中&#xff0c;FFmpeg 是一个强大的开…...

浏览器连不上 Flink WebUI 8081 端口

安装 flink-1.17.0 后&#xff0c;start-cluster.sh 启动&#xff0c;发现浏览器连不上 Flink WebUI 的8081端口。 问题排查&#xff1a; command R&#xff0c;输入cmd&#xff0c;检查宿主机能否ping通虚拟机&#xff0c;发现能ping通。 检查是否有flink以外的任务占用8081…...

Doris集群安装部署(1.2.4.1 release)

此文阅读需要有Linux和服务器硬件基础&#xff01;某些内容写的不是特别细&#xff0c;如果常见的linux基础命令tar、uzip、mv、mkdir、系统包的安装等等&#xff0c;以文字带过了&#xff0c;这样可以减少文章篇幅。官方的安装部署方式一定要好好看一下&#xff0c;最好是尝试…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...