【发布时间】:2021-09-03 13:40:50
【问题描述】:
这是使用动态编程查找数组wordBank 的元素的最短串联以构造字符串Terget 的Java 代码。
示例:
输入: 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;
}
【问题讨论】:
-
数组列表不需要使用
clone()。使用复制构造函数:new ArrayList<>(combination). -
我也做了同样的事,但还是不行
-
“当我递归调用函数时值会发生变化”你能举个例子吗?
标签: java arraylist dynamic-programming