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"]. 无能为力。

    大家讨论下吧?

  • 相关阅读:
    Area--->AreaRegistrationContext.MapRoute
    Area--->AreaRegister.RegisterAllArea()与Area区域的解析
    Area的使用
    ViewData、ViewBag、TempData、Session的区别与联系
    设计模式---装饰模式(转自可均可可博客)
    设计模式---桥接模式(转自可均可可博客)
    设计模式---适配器模式(转自可均可可博客)
    设计模式---原型模式(转自可均可可博客)
    设计模式---简单工厂、工厂方法、抽象工厂
    ASP.NET MVC Controller激活系统详解1
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6971352.html
Copyright © 2011-2022 走看看