• [面试题 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"
            ));
        }
    
    }
    
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
    ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
    ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
    ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
    ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
    ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)
    magento 导入语言包
    php 生成二维码(qrcode)
    在windows下的CLI模式下如何运行php文件
    ftp命令
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359765.html
Copyright © 2020-2023  润新知