1. 题目

你有两个字符串,即pattern和value。
pattern字符串由字母"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仅包含小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 本质:x*a+y*b=n 的整数解
  • 注意例子"ab", "",结果false,容易错
class Solution {public:bool patternMatching(string pattern, string value) {if(pattern==value)return true;else if(pattern=="" && value!="")return false;int i, a = 0, b = 0, vlen = value.size();for(i = 0; i < pattern.size(); ++i){if(pattern[i]=='a')a++;elseb++;}if(a==0 || b==0){if(value=="")//只有一种字符,其代表空串即可满足return true;a = max(a, b);return onlyAorB(value, a);}//a,b均有的情况//a,b均可以表示空字符串, "ab",""if(onlyAorB(value,a) && value.size()!=0)//b表示空串return true;if(onlyAorB(value,b) && value.size()!=0)//a表示空串return true;//a,b均不表示空int la=1, lb=1;//a,b代表的长度while(la*a < vlen){if((vlen-la*a)%b)//不能整除{la++;continue;}lb = (vlen-la*a)/b;if(good(la,lb,pattern,value))return true;la++;}return false;}bool onlyAorB(string& val, int a){if(val.size()%a)//不能整除,不行return false;int n = val.size()/a;string sub = val.substr(0,n);for(int j = n; j < val.size(); j+=n){if(val.substr(j,n) != sub)return false;}return true;}bool good(int la, int lb, string& pat, string& val){int idxa = -1, idxb = -1, i = 0, idx = 0;while(idxa==-1 || idxb==-1){  //找到a,b代表的字符的idxif(pat[i]=='a'){if(idxa == -1)idxa = idx;idx += la;}else{if(idxb == -1)idxb = idx;idx += lb;}i++;}string sa = val.substr(idxa, la);//a代表的字符string sb = val.substr(idxb, lb);//b代表的字符int j = 0, delta;for(i = 0; i < pat.size(); ++i, j+=delta){if(pat[i]=='a'){delta = la;if(val.substr(j,la) != sa)return false;}else{delta = lb;if(val.substr(j,lb) != sb)return false;}}return true;}
};

程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)相关推荐

  1. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  2. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  3. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  4. 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  5. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  6. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  7. 程序员面试金典 - 面试题 16.13. 平分正方形(数学)

    1. 题目 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线. 假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = ...

  8. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

  9. 程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

    1. 题目 假设你有两个数组,一个长一个短,短的元素均不相同. 找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要. 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点 ...

最新文章

  1. python多进程_python多进程
  2. 将一列数据转换成一个字段数据,逗号分隔
  3. Es6学习笔记(7)----数组的扩展
  4. C#指南,重温基础,展望远方!(4)表达式
  5. python简单代码需要写多久_python基本语法?初学Python要多久才能入门?
  6. ubunto应用软件
  7. Python的切片操作
  8. 算法合集之《信息学中守恒法的应用》
  9. 凸优化有关的数值线性代数知识 1矩阵结构与算法复杂性
  10. 世界银行264个国家1437项统计指标
  11. Office EXCEL如何批量把以文本形式存储的数字转换为数字
  12. js字符串格式化方法format
  13. 计算机jsp外文文献,JSP英文参考文献
  14. 一文搞懂人脸识别那点事---人脸识别方案summary
  15. 基于uniapp+unicloud开发的手机备忘录小程序
  16. python基础之语言特点
  17. 卡那霉素(Kanamycin偶联卵清白蛋白 (KAN-OVA)
  18. 豆豆游黄山[201602]
  19. ssh无输入密码登录问题
  20. Acwing - Linux基础课(九)- docker教程

热门文章

  1. buidulbs android.jar,在将AS项目迁移到IDEA时,无法将com.android.bui...
  2. 宏定义与预处理、函数和函数库
  3. LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
  4. web存储机制localStorage和sessionStorage
  5. poj3190 Stall Reservations(贪心+STL)
  6. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...
  7. 奇葩的UI引用LayoutInflater.from问题
  8. 回溯算法--8皇后问题
  9. GARFIELD@01-19-2005
  10. vector深拷贝与浅拷贝使用总结