【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转
旋转字符串
https://leetcode.cn/problems/rotate-string/
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。
示例 1:
输入: s = "abcde", goal = "cdeab"
输出: true
示例 2:
输入: s = "abcde", goal = "abced"
输出: false
提示:
1 <= s.length, goal.length <= 100
s 和 goal 由小写英文字母组成
思路
与重复子串一样有两种思路:
1、直接将字符串s和goal相加,然后再相加后的字符串中查找s或者goal,找到就可以返回true
2、使用KMP算法
先求出s的next数组,然后还是将字符串s和goal相加,得到新字符串
将
goal字符串复制一份连接到自身末尾,得到新的字符串s2的目的是为了模拟旋转操作之后的字符串。假设原始字符串是
s,通过左旋若干次后得到的新字符串是s'。如果我们将s和s'进行比较,就会发现它们实际上是相同的字符串,只是从不同位置开始截取的。而这个位置的关系可以通过将goal复制一份连接到自身末尾来体现。举个例子:假设
s = "abcde",将s左移两位得到的新字符串是s' = "cdeab"。那么将goal复制一份连接到自身末尾,得到的字符串是goal + goal = "cdeababcde"。我们可以发现,在goal + goal中,第一个goal和s'是对应的,因为它们都是从c开始的;第二个goal对应的就是s,因为它们都是从a开始的。
使用KMP算法在新字符串中查找s
为了这点醋包了这碗面
代码
字符串相加使用find
//与重复子字符串的简单版本思路类似
class Solution {
public:
bool rotateString(string s, string goal) {
return s.size() == goal.size() && (s + s).find(goal) != string::npos;
}
};
脱裤子放屁法(KMP)
class Solution {
private:
void getNext(int* next, string& s){
int j = -1;
next[0] = j;
for(int i = 1 ;i < s.size(); ++i){
while(j >= 0 && s[i] != s[j + 1]) j = next[j];
if(s[i] == s[j + 1]) j++;
next[i] = j;
}
}
public:
bool rotateString(string s, string goal) {
//判断一下,如果两个字符串长度不等直接false,如果给的字符串是空,那怎么转都可以得到本身,返回true
//s为空goal不空的情况已经包含第一个判断中
if(s.size() != goal.size()) return false;
if(s.empty()) return true;
// 将goal字符串复制一份连接到自身末尾,得到新的字符串s2
string s2 = goal + goal; //string s2 = s + goal;也行
int j = -1;
int next[s.size()];
getNext(next, s);
for(int i = 0; i < s2.size(); ++i){//在s2中查找s
while(j >= 0 && s2[i] != s[j + 1]){
j = next[j];
}
if(s2[i] == s[j + 1]){
j++;
}
if(j == s.size() - 1) return true;//遍历完s后结束
}
return false;
}
};
字符串轮转
https://leetcode.cn/problems/string-rotation-lcci/
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
提示:
字符串长度在[0, 100000]范围内。
说明:
你能只调用一次检查子串的方法吗?
思路
和旋转字符串一样,直接给代码
代码
字符串相加使用find
//与重复子字符串的简单版本思路类似
class Solution {
public:
bool isFlipedString(string s1, string s2) {
return s1.size() == s2.size() && (s2 + s2).find(s1) != string::npos;
}
};
KMP
//kmp版本
class Solution {
private:
void getNext(int* next, string& s){
int j = -1;
next[0] = j;
for(int i = 1; i < s.size(); ++i){
while(j >= 0 && s[j + 1] != s[i]){
j = next[j];
}
if(s[j + 1] == s[i]) j++;
next[i] = j;
}
}
public:
bool isFlipedString(string s1, string s2) {
if(s1.size() != s2.size()) return false;
if(s1.empty()) return true;
int j = -1;
int next[s1.size()];
string ss2 = s2 + s2;
getNext(next, s1);
for(int i = 0; i < ss2.size(); ++i){
while(j >= 0 && ss2[i] != s1[j + 1]) j = next[j];
if(ss2[i] == s1[j + 1]) j++;
if(j == s1.size() - 1) return true;
}
return false;
}
};
【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转的更多相关文章
- leetcode——Reverse Words in a String 旋转字符串中单词顺序(AC)
题目例如以下: Given an input string, reverse the string word by word. For example, Given s = "the sky ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- c算法:字符串查找-KMP算法
/* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...
- 【字符串】KMP字符串匹配
百度百科 Definition \(KMP\)算法是一个字符串匹配算法.他接收两个字符串\(A,B\),返回\(B\)在\(A\)中出现的所有位置. 以下称需要被匹配的串\(A\)为主串,可能在主串中 ...
- Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)
Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...
- 【字符串】KMP
Algorithm Task 给定一个文本串 \(S\) 和一个模式串 \(T\),求 \(T\) 在 \(S\) 中出现的所有位置. Limitations 要求时空复杂度均为线性. Solutio ...
- 算法数据结构 | 只要30行代码,实现快速匹配字符串的KMP算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法数据结构专题的第29篇文章,我们来聊一个新的字符串匹配算法--KMP. KMP这个名字不是视频播放器,更不是看毛片,它其实是由Kn ...
- [LeetCode]1249. 移除无效的括号(字符串,栈)
题目 给你一个由 '('.')' 和小写字母组成的字符串 s. 你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效. 请返回任意一个合法字符 ...
- HDOJ-1358(字符串压缩+KMP)
Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...
- scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
随机推荐
- [转帖]crash工具分析Kdump下vmcore文件常用命令总结(三)(实例易懂)
一.简介 本文主要介绍使用crash工具对kdump生成的vmcore文件进行分析,解析常见的crash命令,前面已讲述两章关于Kdump的内容,读者感兴趣可以点击下面的链接: 1.Kdump调试机理 ...
- [转帖]Linux中split大文件分割和cat合并文件详解
https://www.yingsoo.com/news/servers/70195.html 当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而 ...
- SUBMIT指定用户名错误
1.SUBMIT说明 在ABAP中,SUBMIT关键字用于运行另一个ABAP程序.通过SUBMIT关键字,可以在当前程序内部调用其他程序,而无需关闭当前程序. SUBMIT语句的一般语法如下: &qu ...
- vue启动报错_interopRequireDefault is not a function
起因 今天接触一个项目vue. 在安装好环境之后,启动的时候报错_interopRequireDefault is not a function 解决的办法:我觉得可能是因为node_modules安 ...
- vue混入mixin
<div id="app"> --{{nick11}} </div> <script> // 全局混入 不需要注册 var m1 = Vue.m ...
- 从零开始配置 vim(6)——缩写
关于vim能快速编辑文本的能力,我们见识到了 operator + motion ,见识到了. 范式和宏.甚至可以使用命令来加快文本编辑.在后面我们又介绍了快捷键绑定来快速执行我们想要的操作.今天我们 ...
- 有用的sql笔记(工作总结)
1.查询当前月(数字为0表示当前月份,1表示上个月,-1表示下个月,以此类推) SELECT DATE_FORMAT((CURDATE() - INTERVAL [数字] MONTH), '%Y-%m ...
- DevToys(开发工具) v1.0.2.1
从事开发工作的朋友们千万不要错过了!今天为大家带来的这款软件可以说是开发人员的必备工具,它就是DevToys软件!DevToys中包含了许多强大实用的开发工具,能够帮助用户将程序开发变得更加简单大大降 ...
- P4396 [AHOI2013] 作业 题解
题目链接:作业 其实可以类似"HH的项链"转化为偏序问题再 cdq 分治.不过这题感觉莫队然后值域分块很好写啊,基本不用动脑. 考虑查询的两个信息: \(a \le x\le b\ ...
- offline 2 online | AWAC:基于 AWR 的 policy update + online 补充数据集
论文题目:AWAC: Accelerating Online Reinforcement Learning with Offline Datasets ICLR 2021 reject,3 4 6 6 ...