模式匹配

题目:

你有两个字符串,即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. PyQt(Python+Qt)学习随笔:Qt Designer中部件的焦点策略focusPolicy设置

    在Qt Designer中可以设置部件的焦点策略,部件的焦点策略属性取值范围由枚举类型Qt.FocusPolicy来定义,该枚举类型及其含义如下表所示: 注意:经老猿测试鼠标轮滚动获取焦点,只有在鼠标 ...

  2. 百度前端技术学院-基础-day20-21

    第二十到第二十一天:让你和页面对话 task1 控制元素的显示及隐藏 实现以下功能: 当用户选择了 School 的单选框时,显示 School 的下拉选项,隐藏 Company 的下拉选项 当用户选 ...

  3. .NET 内存泄漏的争议

    前几天发布了几篇关于要小心使用 Task.Run 的文章,看了博客园的所有评论.发现有不少人在纠结示例中的现象是不是属于内存泄漏,本文分享一下我个人的看法,大家可以保留自己的意见. 在阅读本文前,如果 ...

  4. Filebeat+Logstash自定义多索引

    方案一:推荐 [root@elk-node-1 filebeat]# cat filebeat.yml|egrep -v "^$|^#|#" filebeat.inputs: - ...

  5. nginx 静态化合集(去掉index.php目录)

    访问某域名时,去掉index.php目录时达到效果一样 如:www.test1/index.php/test2跟www.test1/test2效果一致 在vhosts.conf中加重写就可以了 loc ...

  6. 封装事件订阅来进行非父子组件的传值(React)

    const list={} // 将事件名和事件函数装进事件池里 function $on(name,func) { if(!name || !func) return; if(!Object.key ...

  7. mysql 5.7升级8.0

    升级前准备: [root@node01 ~]# mysql -V mysql Ver 14.14 Distrib 5.7.25, for linux-glibc2.12 (x86_64) using ...

  8. screw一键生成数据库文档

    1. 简介   在项目开发和交付阶段,数据库文档是必不可少的.对于大型项目多个数据库几百甚至几千张表来说,手写数据库文档必然是耗时且痛苦的.因此需要一个插件自动生成文档.   screw提供了多种文件 ...

  9. 太酷炫了!!我会Python 导包八种方法,你呢?

    1. 直接 import 人尽皆知的方法,直接导入即可 >>> import os >>> os.getcwd() '/home/wangbm'复制代码 与此类似的 ...

  10. C# HTML帮助类 包括补全标签 截取HTML字符串包含标签

    public static class HtmlHelper { /// <summary> /// 按文本内容长度截取HTML字符串(支持截取带HTML代码样式的字符串) /// < ...