力扣 691 贴纸拼词

题意:给一个字符串,一个字符,最少能用字符串中的几个substring拼出字符

思路:dfs遍历找出最小的合法值

思想:dfs

复杂度:时间O(n*n),空间O(n)

class Solution {
    public int minStickers(String[] stickers, String target) {
        int[][] sc = new int[stickers.length][26];
        // 把每一个字符的字符数目找出
        for(int i=0;i<stickers.length;i++)
            sc[i] = findWordCount(stickers[i]);
        // 记录组成key字符,最少用value个字符串中的substring
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        return dfs(sc,target,map);
    }
    // 找出每一个字符串的字符数目
    public int[] findWordCount(String s){
        int[] charSet = new int[26];
        for(char c:s.toCharArray())
            charSet[c-'a']++;
        return charSet;
    }
    // 返回组成t字符,最少需要用几个字符串中的substring
    public int dfs(int[][] sc,String t,HashMap<String,Integer> map){
        // t为0返回0
        if(t.length()==0)
            return 0;
        // t在之前找到过,返回之前的值
        if(map.containsKey(t))
            return map.get(t);
        
        int max = -1;
        int[] tc = findWordCount(t);
        // 对每一个字符串中的字符,dfs,找出使用它能得到的最小字符串值
        for(int[] s:sc){
            // 如果当前字符包含在t内
            if(s[t.charAt(0)-'a']>0){
                // update t字符为新的target
                String next = updateTargetStr(s,tc);
                // dfs找出新的target需要的最小字符串值
                int len = dfs(sc,next,map);
                // 跟新max
                if(len!=-1)
                    max = max==-1?len+1:Math.min(max,len+1);
            }
        }
        // 把当前最小组成t的值放入map
        map.put(t,max);
        return max;
    }
    // 获取剩下的t字符
    public String updateTargetStr(int[] s,int[] t){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<t.length;i++){
            int j = t[i] - s[i];
            while(j>0){
                sb.append((char)(i+'a'));
                j--;
            }
        }
        return sb.toString();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容