zoukankan      html  css  js  c++  java
  • [面试题 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"
            ));
        }
    
    }
    
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    基于Spring aop写的一个简单的耗时监控
    Intellij Idea 15 旗舰版 破解
    设计模式之工厂模式
    IDE神器intellij idea的基本使用
    [js] js判断浏览器(转)
    java知识大全积累篇
    一些技术大牛的博客集锦(转)
    添加鼠标右击菜单
    java 方法调用绑定
    Android系列--DOM、SAX、Pull解析XML
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359765.html
Copyright © 2011-2022 走看看