zoukankan      html  css  js  c++  java
  • 动态规划之140 Word Break2

    这是一题不太明显的动态规划,主要考察的应该是深度优先搜索。

    static LinkedList<String> list = new LinkedList<String>();
        static ArrayList<String> res=new ArrayList<String>();
        public ArrayList<String> wordBreak(String s, List<String> set) {
            list.clear();
            res.clear();
            if (s == null || s.length() == 0)
                return res;
            if (wordBreakcheck(s, set))
                dfs(s, set);
            return res;
        }
    
        private void dfs(String s, List<String> set) {
            if (s==null||s.length()==0) {
                StringBuilder sb = new StringBuilder();
                for (String ss : list) {
                    sb.append(ss);
                    sb.append(" ");
                }
                res.add(sb.toString().trim());
                return;
            }
            for (int i = 1; i <= s.length(); i++) {
                String str=s.substring(0, i);
                if (set.contains(str)) {
                    list.add(str);
                    //s = s.substring(i, s.length());
                    dfs(s.substring(i, s.length()), set);
                    list.pollLast();
                }
            }
        }
        
        public boolean wordBreakcheck(String s, List<String> set) {
            if (s == null || s.length() == 0)
                return true;
            boolean[] res = new boolean[s.length() + 1];
            res[0] = true;
            for (int i = 0; i < s.length(); i++) {
                StringBuilder str = new StringBuilder(s.substring(0, i + 1));
                for (int j = 0; j <= i; j++) {
                    if (res[j] && set.contains(str.toString())) {
                        res[i + 1] = true;
                        break;
                    }
                    str.deleteCharAt(0);
                }
            }
            return res[s.length()];
        }

    if (set.contains(str)) {
    list.add(str);
    dfs(s.substring(i, s.length()), set);
    list.pollLast();
    }

    if (set.contains(str)) {
    list.add(str);
    s = s.substring(i, s.length());
    dfs(s, set);
    list.pollLast();
    }

     以上两种写法是完全不一样的,已经多次翻车。第一种写法,dfs函数执行完后s然后是没有切割的字符串,而第二种写法是dfs执行完后s已经是切割完的了。

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    企业库连接形式简单例子记录 EnterpriseLibrary.Data
    .net 抽象类(abstract)和接口(interface)区别
    windows service 开发、安装及调试
    asp.net(mvc) 框架
    获取IP地址
    select2 模糊查询远程数据
    设计模式篇——初探命令模式
    初探MVC路由
    初探表达式目录树
    C#实现插入排序法
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10158829.html
Copyright © 2011-2022 走看看