动态规划——StickersToSpellWord

简介: 动态规划——StickersToSpellWord

题目

**给定一个字符串str,给定一一个字符串类型的数组arr。
arr里的每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。
返回需要至少多少张贴纸可以完成这个任务。
例子: str= “babac”,arr = {“ba”,“c”,“abcd”}
至少需要两张贴纸"ba"和"abcd",因为使用这两张贴纸,把每一个字符单独剪开,含有2个a、2个b、1个c。是可以拼出str的。所以返回2。
提示:可变参数能少则少,可变参数越少,缓存结构的命中率越高**

package com.harrison.class13;

import java.util.HashMap;

public class Code07_StickersToSpellWord {
    // 伪代码
//    public static int getMinStickers(String rest,String[] arr) {
//        // 加过滤 保证所有贴纸里的字符能够覆盖目标字符串
//    }
//    
//    public static int minStickers(String rest,String[] arr) {
//        if(rest.equals("")) {
//            return 0;
//        }
//        int next=0;
//        for(String first:arr) {
//            rest-first -> nextRest;
//            int cur=minStickers(nextRest, arr);
//            next=Math.min(next, cur);
//        }
//        return next+1;
//    }
    
    public static int minStickers1(String[] stickers,String target) {
        int n=stickers.length;
        int[][] map=new int[n][26];
        for(int i=0; i<n; i++) {
            char[] str=stickers[i].toCharArray();
            for(char c:str) {
                map[i][c-'a']++;
            }
        }
        HashMap<String, Integer> dp=new HashMap<>();
        dp.put("", 0);
        return process1(dp, map, target);
    }
    
    // dp 傻缓存,如果rest已经算过了,直接返回dp中的值
    // 0...N中每一个字符串所含字符的词频统计
    // 返回值是-1,map中的贴纸无论如何都无法搞定rest
    public static int process1(HashMap<String, Integer> dp,int[][] map,String rest) {
        if(dp.containsKey(rest)) {
            return dp.get(rest);
        }
        // 搞定rest,使用最少的贴纸数量
        int ans=Integer.MAX_VALUE;
        // n种贴纸
        int n=map.length;
        // tmap替代rest
        int[] tmap=new int[26];
        char[] target=rest.toCharArray();
        for(char c:target) {
            tmap[c-'a']++;
        }
        // map-tmap
        for(int i=0; i<n; i++) {// 枚举当前第一张贴纸是谁
            // 小贪心 确保贴纸中至少含有目标字符串中的一种字符才进行尝试
            // 目标字符串中0位置的字符,当前贴纸是否有
            if(map[i][target[0]-'a']==0) {
                continue;
            }
            StringBuilder sb=new StringBuilder();
            // i 当前来到的第一张贴纸
            // j 枚举a~z字符
            for(int j=0; j<26; j++) {
                if(tmap[j]>0) {// j这个字符是target需要的(要搞定的字符串里有这个字符)
                    for(int k=0; k<Math.max(0, tmap[j]-map[i][j]); k++) {
                        sb.append((char)('a'+j));
                    }
                }
            }
            // 经历上面的for循环后,目标字符串减去了第一张贴纸(i)里的字符,
            // 剩余的字符在sb里面
            String s=sb.toString();
            int tmp=process1(dp, map, s);
            if(tmp!=-1) {
                ans=Math.min(ans, tmp+1);
            }
        }
        dp.put(rest, ans==Integer.MAX_VALUE?-1:ans);
        return dp.get(rest);
    }
    
    public static void main(String[] args) {
        String[] arr= {"aaaa","bbaa","ccddd"};
        String str="abcccccdddddbbbaaaaa";
        System.out.println(minStickers1(arr,str));
    }
}
相关文章
|
3天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1084 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1751 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
694 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
660 14
|
6天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
438 5