模式匹配

题目:

你有两个字符串,即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. C#使用ML.Net完成人工智能预测

    前言 Visual Studio2019 Preview中提供了图形界面的ML.Net,所以,只要我们安装Visual Studio2019 Preview就能简单的使用ML.Net了,因为我的电脑已 ...

  2. css3实现立体魔方效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 基于jaccard相似度的LSH

    使用Python通过LSH建立推荐引擎 LSH:一个可以用来处理成百上千行的算法 前提: Python 基础 Pandas 学完本教程之后,解锁成就: 通过建立shingles 为LSH准备训练集和测 ...

  4. BJOI2017 机动训练

    落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...

  5. Java并发编程的艺术(八)——锁相关

    锁的作用 控制多个线程访问共享资源. 线程协作 Lock接口 特点 与synchronized类似的同步功能,只是需要显式地获取和释放锁.缺少隐式获取锁的便捷性. 拥有锁获取与释放的可操作性.可中断的 ...

  6. Jmeter(3)返回内容乱码

    一.创建jmeter实例测试百度接口返回 1.添加线程组 2.添加取样器 3.添加监听器 二.运行结果如下 返回结果中有乱码,原因是Jmeter取样器结果的编码默认为sampleresult.defa ...

  7. 浏览器开发者工具network详解

    General概诉 请求链接 Request URL: 请求方式 Request Method: 代码状态 Status Code: 远程地址 Remote Address: 引用协议 用于过滤 Re ...

  8. ReentrantReadWriterLock源码(state设计、读写锁、共享锁、独占锁及锁降级)

    ReentrantReadWriterLock 读写锁类图(截图来源https://blog.csdn.net/wangbo199308/article/details/108688148) stat ...

  9. [OI笔记]三种逆元的求法

    其实这篇博客只是搬运一下我之前(大概是NOIP那会)写在word里的笔记- 下面直接复制原话,题目是洛谷上求逆元的模板题:https://www.luogu.org/problemnew/show/P ...

  10. OC 大数组分割成由小数组重新组合的新数组

    NSLog(@"++++%@",[self seprateBigArrBySize:3 BigArr:@[@"1",@"2",@" ...