Java 动态规划记忆

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,

我正在处理一个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,
     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”等等