字符串、字典匹配算法

package StringAndArray;

import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 一字符串s与一个包含多个字符串的set字典dict,查询set字典中部分字符串是否能拼接成s
 * 
 * @author fh
 *
 */
public class Word_Break {

    public static void main(String[] args) {
        Set<String> dict = null;
        String s=null;

        s="programcreek";
        dict = new HashSet<String>();
        dict.add("programcree");
        dict.add("program");
        dict.add("creek");

        boolean b=wordBreak(s, dict);
        System.out.println(s+"在字典dict是否可查询:"+b);
        // Regrex();
    }

    /**
     * The key to solve this problem by using dynamic programming approach:
     * 
     * Define an array t[] such that t[i]==true => 0-(i-1) can be segmented
     * using dictionary Initial state t[0] == true
     * 
     * Time: O(string length * dict size)
     * 
     * One tricky part of this solution is the case:
     * 
     * INPUT: "programcreek", ["programcree","program","creek"].
     */
    public static boolean wordBreak(String s, Set<String> dict) {

        boolean[] t = new boolean[s.length() + 1];
        t[0] = true;// 需要一个初始值

        for (int i = 0; i < s.length(); i++) {

            if (!t[i])// 该字符与前面拼接的字符串在dict中不存在,则跳出本次循环
                continue;

            // 循环遍历字典,查出以i为起点的所有匹配子字符串
            for (String sub : dict) {
                int len = sub.length();
                int end = i + len;

                //剩余待匹配字符串长度小于字典中的匹配子字符串
                if (end > s.length())
                    continue;

                if(s.substring(i, end).equals(sub)){
                    t[end]=true;
                    if(end==s.length()){
                        return true;
                    }
                }

            }

        }
        return false;
    }

    // 正则法解题
    private static void Regrex() {
        HashSet<String> dict = 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 + ")*";
        System.err.println(pattern);
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher("goalgoalspecial");

        if (m.matches()) {
            System.out.println("match");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值