• Java Word Break(单词拆解)


    给定一个字符串 String s = "leetcode"
    dict = ["leet", "code"].

    查看一下是够是字典中的词语组成。假设是返回true,否则返回false。

    下边提供3种思路

    1.动态算法

    import java.util.HashSet;
    import java.util.Set;
    
    public class WordBreak1 {
    	public static void main(String[] args) {
    		//"["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
    		//String s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
    		String s ="LeetCodea";
    		Set<String> dict = new HashSet<String>();
    		dict.add("Leet");
    		dict.add("Code");
    		dict.add("a");
    		System.out.println(wordBreak(s,dict));
    	}
    	public static boolean wordBreak(String s, Set<String> dict) {
    		boolean[] t = new boolean[s.length() + 1];
    		t[0] = true; // set first to be true, why?
    		// Because we need initial state
    
    		for (int i = 0; i < s.length(); i++) {
    			// should continue from match position
    			if (!t[i])
    				continue;
    			for (String a : dict) {
    				int len = a.length();
    				int end = i + len;
    				if (end > s.length())
    					continue;
    
    				if (t[end])
    					continue;
    
    				if (s.substring(i, end).equals(a)) {
    					t[end] = true;
    				}
    			}
    		}
    		return t[s.length()];
    	}
    }

    2.普通算法(1)

    import java.util.Set;
    
    public class WorkBreak2 {
    	public boolean wordBreak(String s, Set<String> dict) {
    		return wordBreakHelper(s, dict, 0);
    	}
    
    	public boolean wordBreakHelper(String s, Set<String> dict, int start) {
    		if (start == s.length())
    			return true;
    
    		for (String a : dict) {
    			int len = a.length();
    			int end = start + len;
    
    			// end index should be <= string length
    			if (end > s.length())
    				continue;
    
    			if (s.substring(start, start + len).equals(a))
    				if (wordBreakHelper(s, dict, start + len))
    					return true;
    		}
    		return false;
    	}
    }

    3.普通算法(2)

    import java.util.Set;
    
    public class WordBreak3 {
    
    	public static boolean wordBreak(String s, Set<String> dict) {
    		// input validation
    		// Base case
    		if (dict.contains(s))
    			return true;
    		else {
    			for (int i = 0; i < s.length(); i++) {
    				String sstr = s.substring(0, i);
    				if (dict.contains(sstr))
    					return wordBreak(s.substring(i), dict);
    			}
    		}
    		return false;
    	}
    }


    可是以上的算法有一个问题,就是遇到这样的情况。INPUT: "programcreek", ["programcree","program","creek"]. 无能为力。

    大家讨论下吧?

  • 相关阅读:
    【C/C++】散列/算法笔记4.2
    【C/C++】PAT A1025 Ranking/算法笔记
    【科研工具】CAJViewer的一些操作
    【科研工具】知云-外文文献翻译神器
    【科研工具】流程图软件Visio Pro 2019 详细安装破解教程
    【Word】自动化参考文献-交叉引用
    【Matlab】线性调频信号LFM 仿真
    不是人人都懂的学习要点
    linux的那些事
    从一个男人身上看出他的修养和抱负
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6971352.html
Copyright © 2020-2023  润新知