递归的记忆
一个很简单的题目:
有一串字符串“abcdabcdabcdabcd”
我希望通过递归的方式将它拆分成四个abcd并记录到List<String>中
使用递归很简单:
public List<String> recursionMemory(String data){
List<String> list = new ArrayList<String>();
if(data.length() == 0){
list.add("");
return list;
}
String singleWord = data.substring(0,4);
List<String> downSearch = recursionMemory(data.substring(4));
for (String key:downSearch ){
list.add(key);
}
list.add(singleWord);
return list;
}
这是打印出来的结果,那么,我们回顾算法实验室-22的问题:
对于“nowcoderisbest”
这样一个单词,我们希望能够构造一个完整的记忆map,记住正确的完成的操作:
这是22中最后一部分介绍的优化方法提出的分割方案,可以看到的是,存在了重复性劳动,如上图所示
这个时候,我们希望通过建立一个Map<String,List<String>> map的记忆map存储[best]对应的劳动成果,当下一次处理的data是best时,将直接使用map[best]的数据,而不需要进行重复性计算
这样,我们又可以进行优化了
public List<String> recursion4(String data,int len,HashMap<String,List<String>> map){
if(map.containsKey(data)){
return map.get(data);
}
List<String> tempList = new ArrayList<String>();
//递归结束条件
if(data.length() == 0){
tempList.add("");
return tempList;
}
for (String key:dict){
if(data.length()>=key.length()){
String singleWorld = data.substring(0,key.length());
lens++;
if(singleWorld.equals(key)){
String d2 = data.substring(key.length());
List<String> memo = recursion4(d2,len,map);
String temp2 = singleWorld+" ";
for (String key2:memo
) {
temp2+= key2+" ";
}
tempList.add(temp2.trim());
if(data.length() == len){
Debug.Log(tempList, Debug.DebugType.MultiRow);
}
}
}
}
map.put(data,tempList);
return tempList;
}
计算次数:
[nowcoder] [1]
[isb] [2]
[is] [3]
[bes] [4]
[be] [5]
[best] [6]
[isbe] [7]
[now] [8]
[coderisb] [9]
[cod] [10]
[co] [11]
[code] [12]
[coderis] [13]
[no] [14]
[nowc] [15]
[nowcode] [16]
19->16
进一步优化
import java.util.*;
public class Solution {
ArrayList<String> l3;
HashMap<String,Boolean> signMap ;
public ArrayList<String> wordBreak(String s, Set<String> dict) {
signMap = new HashMap<String, Boolean>();
this.dict = dict;
l3 = recursion4(s,s.length(),new HashMap<String,ArrayList<String>>());
return l3;
}
//请在构造初始化
String output = "";
Set<String> dict;
Set<String> repetition;
static int lens = 0;
public ArrayList<String> recursion4(String data, int len, HashMap<String,ArrayList<String>> map){
if(map.containsKey(data)){
return map.get(data);
}
ArrayList<String> tempList = new ArrayList<String>();
//递归结束条件
if(data.length() == 0){
tempList.add("");
return tempList;
}
for (String key:dict){
if(data.length()>=key.length()){
String singleWorld = data.substring(0,key.length());
lens++;
if(singleWorld.equals(key)){
String d2 = data.substring(key.length());
List<String> memo = recursion4(d2,len,map);
for (String key2:memo
) {
tempList.add((singleWorld+" "+key2).trim());
}
}
}
}
map.put(data,tempList);
return tempList;
}
public List<String> recursionMemory(String data){
List<String> list = new ArrayList<String>();
if(data.length() == 0){
list.add("");
return list;
}
String singleWord = data.substring(0,4);
List<String> downSearch = recursionMemory(data.substring(4));
for (String key:downSearch ){
list.add(key);
}
list.add(singleWord);
return list;
}
}
哎....真的...我眼睛都花了,赶紧洗眼镜去
这一段代码还是需要好好琢磨一下的,我们最后会合计出两个结果: