给定一个源字符串,一个字符串字典,判断该字典是否是由源字符串完全分割而来的

 

  比如一个源字符串:“welcome”  一个字典,假设是String数组{"wel","m","com"},这个判断是true,算法如下:

public static boolean wordBreak(String s, Set<String> dict) {
		return wordBreakHelper(s, dict, 0);
	}

	/**
	 * 算法思路是这样的:强调下,在思考算法之前一定要把题目的因果关系搞清楚以及需要明确结果成立的条件,此外找出条件与结果的规律也很重要。
	 * 本例中,可以这么理解,字典实际上就是源字符串被分割而成的。我们只需要根据字典中的每个字符串的长度 依顺序截取源字符串进行比较即可。 
	 * 由此算法如下:
	 * 对给定的字典进行遍历,每次遍历都用当前的字典元素与源字符串截取等长的字符串进行比较,
	 * 截取子字符串的开始位置从0开始,如果结果返回true,那么就一定会让这两者相等的时候,
	 * 当相等的时候就让开始截取的位置向前移动前一个已匹配的元素的长度,如此递归遍历,直到将所有字典遍历完毕。
	 * 
	 * @param s
	 * @param dict
	 * @param start
	 * @return
	 */
	public static 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;
	}

   当然了,根据上面的1解释,也可以使用模式匹配来进行判断:

  

public static void main(String[] args) {
		
		// ========== 使用正则表达式匹配 =============
		Set<String> dict = new HashSet<String>();
		HashSet<String> dicts = new HashSet<String>();
		dict.add("go");
		dict.add("goal");
		dict.add("goals");
		dict.add("special");
		StringBuilder sb = new StringBuilder();
		for (String s : dict) {
			sb.append(s + "|");
		}
		String pattern = sb.toString().substring(0, sb.length() - 1);
		pattern = "(" + pattern + ")*";
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher("goalspecial");

		if (m.matches()) {
			System.out.println("匹配成功");
		}
	}

    以上算法参考自:http://www.programcreek.com/2012/12/leetcode-solution-word-break/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值