LeetCode 面试题16.18.模式匹配
模式匹配
题目:
你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。
0 <= len(pattern) <= 10000 <= 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.模式匹配的更多相关文章
- C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解
面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...
- leetcode面试题 17.16. 按摩师
leetcode面试题 17.16. 按摩师 又一道动态规划题目 动态规划的核心就是总结出一个通行的方程. 但是这道题似乎不太适合使用递归的方式. 所以使用for循环遍历数组. class Solut ...
- C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和
上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...
- 剑指offer——面试题16:数值的整数次方
// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...
- 【剑指offer】面试题 16. 数值的整数次方
面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...
- C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介
目录 为什么要刷LeetCode 刷LeetCode有哪些好处? LeetCode vs 传统的 OJ LeetCode刷题时的心态建设 C#如何刷遍LeetCode 选项1: VS本地Debug + ...
- C#刷遍Leetcode面试题系列连载(2): No.38 - 报数
目录 前言 题目描述 相关话题 相似题目 解题思路: 运行结果: 代码要点: 参考资料: 文末彩蛋 前言 前文传送门: C# 刷遍 Leetcode 面试题系列连载(1) - 入门与工具简介 上篇文章 ...
- C#刷遍Leetcode面试题系列连载(5):No.593 - 有效的正方形
上一篇 LeetCode 面试题中,我们分析了一道难度为 Easy 的数学题 - 自除数,提供了两种方法.今天我们来分析一道难度为 Medium 的面试题. 今天要给大家分析的面试题是 LeetCod ...
- C# 刷遍 Leetcode 面试题系列连载(3): No.728 - 自除数
前文传送门: C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介 C#刷遍Leetcode面试题系列连载(2): No.38 - 报数 系列教程索引 传送门:https://enjoy2 ...
随机推荐
- PyQt学习随笔:Qt事件类QEvent详解
QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...
- Gitlab勾选Remove Source Branch后本地仍然能够看到该分支
现象: Gitlab合并Merge Request时,勾选了Remove Source Branch,但是本地仍然能够看到该分支(git branch -a),而远程仓库中该分支已经不存在. 解决: ...
- 使用kali生成远控payload
kali linux中的metasploit框架是优秀的渗透框架之一,今天记载一下使用kali生成windows远控木马的过程 生成payload使用的工具是MSFVenom,我们输入msfvenom ...
- 图 Graph
本文主要内容为:图的定义以及基本术语 图的定义 图 图G的组成:由 数据元素的集合E 和 数据间的关系集合E 组成,记作:G = <V, E> 顶点 (vertex):数据元素,V就是顶点 ...
- qtp学习入门
qtp的学习,初始入门是简单的,推荐田艳琴的<QTP从实践到精通>这边书,看过后,一周就可以入门,并能够自行编写脚本,但是想要进入更深一层,则需要更广阔的知识!这条路任重道远,你我共勉
- 题解-FJOI2014 树的重心
FJOI2014 树的重心 \(Q\) 组测试数据.给一棵树大小为 \(n\),求有多少个子树与其重心相同.重心可能有多个. 数据范围:\(1\le Q\le 50\),\(1\le n\le 200 ...
- Chrome DevTools — Network -- 转载
转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...
- 抖音数据采集SDK
接口参数.返回示例请参考文档:抖音api Github仓库:DouyinSDK 0. 初始化 from douyin import AwemeSDK token = 'xxxxxxxx' host = ...
- Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题
前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author : lo ...
- ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能
这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...