zoukankan      html  css  js  c++  java
  • 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"]. 无能为力。

    大家讨论下吧?

  • 相关阅读:
    Magicodes.IE之花式导出
    Magicodes.IE之导入导出筛选器
    Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
    快速配置Azure DevOps代理服务器
    如何做好一个开源项目之徽章(二)
    使用Seq搭建免费的日志服务
    SpringBoot + SpringCloud Hystrix 实现服务熔断
    dedecms从word复制粘贴公式
    CuteEditor从word复制粘贴公式
    TinyMCE从word复制粘贴公式
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6971352.html
Copyright © 2011-2022 走看看