Java 动态规划记忆
我正在处理一个DP问题,其中删除了一个带有空格的字符串,我需要实现buttom up和Memorization版本,将字符串拆分为单个英语单词。然而,我得到了最新版本,然而,回忆录似乎有点复杂Java 动态规划记忆,java,dynamic,memoization,Java,Dynamic,Memoization,我正在处理一个DP问题,其中删除了一个带有空格的字符串,我需要实现buttom up和Memorization版本,将字符串拆分为单个英语单词。然而,我得到了最新版本,然而,回忆录似乎有点复杂 /* Split a string into individual english words * @String str the str to be splitted * @Return a sequence of words separated by space if successful,
/* Split a string into individual english words
* @String str the str to be splitted
* @Return a sequence of words separated by space if successful,
null otherwise
*/
public static String buttom_up_split(String str){
int len = str.length();
int[] S = new int[len+1];
/*Stores all the valid strings*/
String[] result = new String[len+1];
/*Initialize the array*/
for(int i=0; i <= len; i++){
S[i] = -1;
}
S[0] =0;
for(int i=0; i < len; i++){
if(S[i] != -1){
for(int j= i+1; j <= len; j++){
String sub = str.substring(i, j);
int k = j;
if(isValidEnglishWord(sub)){
S[k] = 1; //set true indicates a valid split
/*Add space between words*/
if(result[i] != null){
/*Add the substring to the existing words*/
result[i+ sub.length()] = result[i] + " " + sub;
}
else{
/*The first word*/
result[i+ sub.length()] = sub;
}
}
}
}
}
return result[len]; //return the last element of the array
}
/*将字符串拆分为单个英语单词
*@String str要拆分的str
*@如果成功返回一个空格分隔的单词序列,
否则无效
*/
公共静态字符串按钮向上拆分(字符串str){
int len=str.length();
int[]S=新的int[len+1];
/*存储所有有效字符串*/
字符串[]结果=新字符串[len+1];
/*初始化数组*/
对于(inti=0;i好吧,我不是一个记忆的出口,但我的想法是对以前的好英语单词有一个“记忆”。
这样做的目的是节省计算时间:在您的例子中,调用isValidEnglishWord()
因此,您需要通过以下方式调整算法:
遍历“str”字符串
从中提取一个子字符串
检查子字符串是否为内存中的有效单词。
它在内存中:在结果中添加空格和单词
它不在内存中:调用isValidEnglishWord并处理其返回
它将给出类似(未测试或编译)的内容
//这是我们的记忆
导入java.util*
私有静态映射内存=新HashMap()
公共静态字符串按钮向上拆分(字符串str){
int len=str.length();
int[]S=新的int[len+1];
字符串[]结果=新字符串[len+1];
对于(inti=0;i好吧,我不是一个记忆的出口,但我的想法是对以前的好英语单词有一个“记忆”。
这样做的目的是节省计算时间:在您的例子中,调用isValidEnglishWord()
因此,您需要通过以下方式调整算法:
遍历“str”字符串
从中提取一个子字符串
检查子字符串是否为内存中的有效单词。
它在内存中:在结果中添加空格和单词
它不在内存中:调用isValidEnglishWord并处理其返回
它将给出类似(未测试或编译)的内容
//这是我们的记忆
导入java.util*
私有静态映射内存=新HashMap()
公共静态字符串按钮向上拆分(字符串str){
int len=str.length();
int[]S=新的int[len+1];
字符串[]结果=新字符串[len+1];
对于(int i=0;i就我个人而言,我总是喜欢在不修改算法的情况下尽可能透明地使用备忘录。这是因为我希望能够将算法与备忘录分开进行测试。此外,我正在开发一个备忘录库,在该库中,您只需将@Memoize添加到适用于备忘录的方法中。但不可原谅这对你来说太晚了
上一次我使用Memorization(没有我的库)时,我使用实现了它。一个重要的注意事项是,此实现不支持递归。但这不应该是一个问题,因为您的算法不是递归的
其他参考资料包括:
请注意您的算法:
你如何处理含有其他单词的单词?比如“verbose”包含“动词”,“theory”包含“the”等等。就我个人而言,我总是喜欢在不修改算法的情况下尽可能透明地使用Memorization。这是因为我希望能够独立于Memorization来测试算法。此外,我正在开发一个Memorization库,您只需将@Memorize添加到适用于Memorization的方法中即可。但不可更改这对你来说太晚了
上一次我使用Memorization(没有我的库)时,我使用实现了它。一个重要的注意事项是,此实现不支持递归。但这不应该是一个问题,因为您的算法不是递归的
其他参考资料包括:
请注意您的算法:
你如何处理有其他单词的单词?比如“verbose”包含“动词”,“theory”包含“the”等等