比如一个源字符串:“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/