模式匹配

题目:

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

  • 0 <= len(pattern) <= 1000
  • 0 <= len(value) <= 1000

来源:力扣(LeetCode)


思路:

预处理:

如果pattern第一个字符不是‘a’,那么我们就把pattern 中 ‘a’,‘b'全部反过来即刻(a=b,b=a)。

我们用两层for循环,外层遍历value,内层遍历pattern。

外层:

用i来遍历,而i的大小就是a的长度,由此计算出b的长度。

注意:a的长度可以为零,而b的长度也可以为零。

n 为 value 的长度。blen为b的长度,bNum为b在pattern中出现的次数,alen与aNum同理。

blen = (n-alen 乘以 aNum)/bNum>=0?(n-alen 乘以 aNum)/bNum:0;

而根据求出来b的长度和a的长度反过来计算value的长度,如果不相等,则跳过本次循环,如果相等,则由pattern得到a和b字符串,进入内层循环。

内层:

根据pattern以及外层得到的a,b字符串,拼出来一个字符串tmp,内层循环结束后与value比较,如果相等,则返回true,否则继续下一次外层循环。

本题思路很好想,就是边界条件和细节是难点。


代码:

class Solution {
public boolean patternMatching(String pattern, String value) {
StringBuffer p = new StringBuffer(pattern);
int m = p.length();
int n = value.length();
//边界处理
if(n == 0){
if(m == 0){
return true;
}
if(p.indexOf("a")>=0&&p.indexOf("b")>=0){
return false;
}
return true;
}
if(n!=0&&m==0){
return false;
}
//开头如果是b,a,b互换
if(p.charAt(0)=='b'){
for(int i = 0;i<p.length();i++){
if(p.charAt(i)=='a'){
p.setCharAt(i,'b');
}else{
p.setCharAt(i,'a');
}
}
}
int aNum = 0;
int bNum = 0;
//计算a,b在pattern中出现的次数
for(int i = 0;i<m;i++){
if(p.charAt(i)=='a'){
aNum++;
}else{
bNum++;
}
}
//value for循环
for(int i = 0;i<=n;i++){
int alen = i;
StringBuffer a = new StringBuffer(value.substring(0,i));
int blen = 0;
if(bNum!=0){
blen = (n-alen*aNum)/bNum>=0?(n-alen*aNum)/bNum:0;
}
if(blen*bNum+alen*aNum != n){
continue;
}
StringBuffer b = new StringBuffer();
int idx = p.indexOf("b");
if(idx>=0){
b = new StringBuffer(value.substring(idx*alen,idx*alen+blen));
}
StringBuffer tmp = new StringBuffer();
//pattern for循环
for(int j = 0;j<m;j++){
if(p.charAt(j)=='a'){
tmp.append(a);
}else{
tmp.append(b);
}
}
//拼凑出了来的tmp对比原字符串value
if(tmp.toString().equals(value)){
return true;
}
}
return false;
}
}

LeetCode 面试题16.18.模式匹配的更多相关文章

  1. C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解

    面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...

  2. leetcode面试题 17.16. 按摩师

    leetcode面试题 17.16. 按摩师 又一道动态规划题目 动态规划的核心就是总结出一个通行的方程. 但是这道题似乎不太适合使用递归的方式. 所以使用for循环遍历数组. class Solut ...

  3. C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和

    上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...

  4. 剑指offer——面试题16:数值的整数次方

    // 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...

  5. 【剑指offer】面试题 16. 数值的整数次方

    面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...

  6. C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介

    目录 为什么要刷LeetCode 刷LeetCode有哪些好处? LeetCode vs 传统的 OJ LeetCode刷题时的心态建设 C#如何刷遍LeetCode 选项1: VS本地Debug + ...

  7. C#刷遍Leetcode面试题系列连载(2): No.38 - 报数

    目录 前言 题目描述 相关话题 相似题目 解题思路: 运行结果: 代码要点: 参考资料: 文末彩蛋 前言 前文传送门: C# 刷遍 Leetcode 面试题系列连载(1) - 入门与工具简介 上篇文章 ...

  8. C#刷遍Leetcode面试题系列连载(5):No.593 - 有效的正方形

    上一篇 LeetCode 面试题中,我们分析了一道难度为 Easy 的数学题 - 自除数,提供了两种方法.今天我们来分析一道难度为 Medium 的面试题. 今天要给大家分析的面试题是 LeetCod ...

  9. C# 刷遍 Leetcode 面试题系列连载(3): No.728 - 自除数

    前文传送门: C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介 C#刷遍Leetcode面试题系列连载(2): No.38 - 报数 系列教程索引 传送门:https://enjoy2 ...

随机推荐

  1. ollvm在VS2017下编译

    0x1,首先介绍一下编译环境配置 1.UE4.25 2.vs2017(15.9),注:2019编译总是出现错误 3.cmake3.18.5,cmake的作用是为ollvm源码编译成适合于在vs2017 ...

  2. sudo rm -rf /*含义

    sudo -----  管理员权限 rm ------ remove 移除 rf ------ recursive递归  force强制 /* ------ 目录下所有文档

  3. Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. 20201214-1 Json与pickle数据序列化

    1-1 文件处理时,只能存字符串或者二进制 info = { 'name':'alex', 'age':22 } f = open("test.text", "w&quo ...

  5. 设置非root账号不用sudo直接执行docker命令

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. <UnityTheGreat><001>获取指定目录下指定类型的所有文件的名称

    #region Environment Windows 10 Unity 2019.4.16f1c1 LTS VSCode 1.52 https://github.com/MirzkisD1Ex0/U ...

  7. 事件修饰符 阻止冒泡 .stop 阻止默认事件 .prevent

    stop修饰符 阻止冒泡行为 可以在函数中利用$event传参通过stopPropagation()阻止冒泡 通过直接在元素中的指令中添加 .stop prevent修饰符 阻止默认行为 可以在函数中 ...

  8. python 类和方法(面向对象)

    类和方法 name = "Jack" city = "bejing" print("my name is %S and come from %s &q ...

  9. react第十九单元(react+react-router-dom+redux综合案例1)

    第十九单元(react+react-router-dom+redux综合案例1) #课程目标 复习 综合练习 实战能力 #知识点 react react-router redux #授课思路 #案例和 ...

  10. OS第六章

    OS第七次实验 多进程 添加一个进程体 添加进程B,首先设置i的初值为0x1000,这样来方便程序运行时的时候能区分.其余地方与A一致. 相关变量和宏 Minix中定义了一个数组,叫做tasktab的 ...