WordBreakII_140

leetcode链接:https://leetcode.com/problems/word-break-ii/description/
  这道题目和之前的WordBreak类似,但是难度大了不少,因为要穷举出所有可能的组合情况,而不是简单的判断,这样,再采用之前解决WordBreak的动态规划,自底向上推导出结果的办法,不太可能,这里我采用对字符串进行暴力破解,自顶向下,循环递归,试图优化解决的。
思路:
  字符串s要被字典组合表示,那么s的首字母所在子串必定出现在字典中,就从这里开始遍历。
这里写图片描述
如图所示字符串s长度为 N。从a出发,把这N中情况全部递归执行一次,假设在a–>c这条路上,也就是说“abc”出现在了字典中,那么就进入下一轮递归,此时c就相当于取代了之前a的位置,这样不断循环遍历下去。
代码:

/*
 * leetcode链接:https://leetcode.com/problems/word-break-ii/description/
 */
package leetcode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class WordBreakII_140 {
    public static void main(String[] args) {
        String s = "catsanddog";  //测试用例字符串
        Set<String> dict = new HashSet<String>();   //测试用例字典
        dict.add("cat");
        dict.add("cats");
        dict.add("and");
        dict.add("sand");
        dict.add("dog");
        ArrayList<ArrayList<String>> res = wordBreakII(s, dict);
        System.out.println(res.toString());


    }
    private static ArrayList<ArrayList<String>> wordBreakII(String s, Set<String> dict) {
        ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();   //保存最终结果
        ArrayList<String> single = new ArrayList<String>();    //保存中间结果
        if(s.length() == 0) 
            return null;
        wordBreakII(s, 0, dict, single, res);
        return res;

    }
    private static void wordBreakII(String s, int begin, Set<String> dict,
             ArrayList<String> single, ArrayList<ArrayList<String>> res) {
        //循环迭代的结束条件
        if(begin == s.length()) {
            ArrayList<String> single_temp = new ArrayList<String>();  //实现深复制,把数据进行保存
            for(int i = 0; i < single.size(); i++) {
                single_temp.add(single.get(i));
            }
            res.add(single_temp);
            //single.remove(single.get(single.size() - 1));   //删除single的最后一个元素
            return;
        }
        for(int i = begin; i < s.length(); i++) {
            String temp = s.substring(begin, i + 1);
            if(dict.contains(temp)) {   //当前子串存在于字典中
                single.add(temp);    //将存在于字典中的子串进行保存
                wordBreakII(s, i + 1, dict, single, res);
                single.remove(single.size() - 1);  //数据已保存,将存入的字符串删除
            }
        }
    }
}

  这个代码是十分简洁的,主函数提供了测试用例,并用一个ArrayList来接收最终的结果,每一个元素都按顺序存储着一种组合情况。wordBreakII()是两个重载函数,这样设计是为了松耦合,同时递归模块也更清晰。wordBreakII(String s, Set dict)接收参数,调用递归模块。变量res存储最终结果,single存储中间递归结果。
注意single_temp那一块,由于引用的原因,必须创建新的对象,并将single的数据深复制过去,这样才能把数据独立存储到res中。
这个实现显然是指数级别的,典型的循环 * 递归的模式。欢迎更好的解法!!!

内容概要:本文档提供了三种神经网络控制器(NNPC、MRC和NARMA-L2)在机器人手臂模型上性能比较的MATLAB实现代码及详细解释。首先初始化工作空间并设定仿真参数,包括仿真时间和采样时间等。接着定义了机器人手臂的二阶动力学模型参数,并将其转换为离散时间系统。对于参考信号,可以选择方波或正弦波形式。然后分别实现了三种控制器的具体算法:MRC通过定义参考模型参数并训练神经网络来实现控制;NNPC利用预测模型神经网络并结合优化算法求解控制序列;NARMA-L2则通过两个神经网络分别建模f和g函数,进而实现控制律。最后,对三种控制器进行了性能比较,包括计算均方根误差、最大误差、调节时间等指标,并绘制了响应曲线和跟踪误差曲线。此外,还强调了机器人手臂模型参数的一致性和参考信号设置的规范性,提出了常见问题的解决方案以及性能比较的标准化方法。 适合人群:具备一定编程基础,特别是熟悉MATLAB编程语言的研究人员或工程师,以及对神经网络控制理论有一定了解的技术人员。 使用场景及目标:①理解不同类型的神经网络控制器的工作原理;②掌握在MATLAB中实现这些控制器的方法;③学会如何设置合理的参考信号并保证模型参数的一致性;④能够根据具体的性能指标对比不同控制器的效果,从而选择最适合应用场景的控制器。 其他说明:本文档不仅提供了完整的实验代码,还对每个步骤进行了详细的注释,有助于读者更好地理解每段代码的功能。同时,针对可能出现的问题给出了相应的解决办法,确保实验结果的有效性和可靠性。为了使性能比较更加公平合理,文档还介绍了标准化的测试流程和评估标准,这对于进一步研究和应用具有重要的指导意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值