将一个 ArrayList 克隆到另一个 ArrayList 在 DP 中不起作用

Clone an ArrayList to another ArrayList does not work in DP

这里是 Java 代码,使用动态规划找到数组 wordBank 元素的最短串联以构造字符串 Terget

示例:

输入: wordBank = {"ab", "c", "d", "abc", "ad"}, 目标 = "abcd".

输出: {"abc", "d"}。

为此,我将元素的组合作为 ArrayList 存储在 HashMap 中。 但是,hashMap 没有正确存储值,即当我递归调用该函数时值发生变化,尽管我在将 ArrayList 添加到地图之前克隆了它。

知道为什么会这样吗?

该代码适用于数组。

static ArrayList<String> bestConstruct(String target, String[] wordBank, HashMap<String, ArrayList<String>> map) {
    
    if(target.isEmpty())
    {
        return new ArrayList<String>();
    }
    
    if(map.containsKey(target))
        return map.get(target);
    
    ArrayList<String> shortestCombination = null;
    for (String word : wordBank) {
        
        if(target.startsWith(word)) {
            String newTarget = target.substring(word.length(), target.length());
            
            ArrayList<String> combination = bestConstruct(newTarget, wordBank, map);
            
            
            if(combination != null) {
                combination.add(word);
                
                if(shortestCombination == null || combination.size() < shortestCombination.size())
                    shortestCombination = (ArrayList<String>)(combination.clone());
            }
        }
    }
    map.put(target,  (ArrayList<String>) (shortestCombination.clone()));
    return shortestCombination;
}

问题是这些行之间的交互:

    if(map.containsKey(target))
        return map.get(target);

            ArrayList<String> combination = bestConstruct(newTarget, wordBank, map);
            
            
            if(combination != null) {
                combination.add(word);

如果您 return 记忆列表,则在克隆它之前对其进行更新。

一般来说,不要依赖调用者“做正确的事”:如果您不想更新地图中的列表,请在 return 之前自己进行复制:

    if(map.containsKey(target))
        return new ArrayList<>(map.get(target));

您可能还需要处理无法从词库构造字符串的情况。