[面试题 16.18. 模式匹配]

[面试题 16.18. 模式匹配]

你有两个字符串,即patternvaluepattern字符串由字母"a""b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat""a""go""b"),该字符串也匹配像"a""ab""b"这样的模式。但需注意"a""b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。

示例 1:

输入: pattern = "abba", value = "dogcatcatdog"
输出: true

示例 2:

输入: pattern = "abba", value = "dogcatcatfish"
输出: false

示例 3:

输入: pattern = "aaaa", value = "dogcatcatdog"
输出: false

示例 4:

输入: pattern = "abba", value = "dogdogdogdog"
输出: true
解释: "a"="dogdog",b="",反之也符合规则

提示:

  • 0 <= len(pattern) <= 1000
  • 0 <= len(value) <= 1000
  • 你可以假设pattern只包含字母"a""b"value仅包含小写字母。

思路:暴力枚举a和b可能的字符串,可以通过先匹配长度剪枝

package LeetCode;

/**
 * @ClassName M16_8
 * @Description TODO
 * @Author m
 * @Version 1.0
 */
public class M16_8 {

    public boolean patternMatching(String pattern, String value) {

        int num_a = 0;
        int num_b = 0;
        for (int i = 0; i < pattern.length(); i++) {
            if(pattern.charAt(i) == 'a'){
                num_a++;
            }else {
                num_b++;
            }
        }

        if(value.length() == 0){
            return (num_a*num_b == 0);
        }
        if(pattern.length() == 0){
            return value=="";
        }

        if(num_a == 0) {
            num_a = num_b;
        }
        if (num_b == 0){
            num_b = num_a;
        }

        //枚举b字符串的长度,枚举a的也一样
        for (int i = 0; i <= value.length()/num_b; i++) {
            String sa = "";
            String sb = "";
            //a的总长
            int lens = value.length() - i * num_b;
            //如果平均a的长度不为整数,continue;
            if (lens % num_a != 0) {
                continue;
            }

            //a的长度
            int lena = lens/num_a;

            StringBuilder res = new StringBuilder();
            for (int i1 = 0; i1 < pattern.length(); i1++) {
                if (pattern.charAt(i1) == 'a') {
                    if(sa.equals("") && lena != 0){
                        sa = value.substring(res.length(),res.length()+lena);
                    }
                    res.append(sa);
                } else {
                    if(sb.equals("") && i != 0){
                        sb = value.substring(res.length(),res.length()+i);
                    }
                    res.append(sb);
                }
            }

            if (res.toString().equals(value)) {
                return true;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        System.out.println(new M16_8().patternMatching("abba",
                "dogcatcatdog"
        ));
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值