旋转字符串

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'。如果我们将 ss' 进行比较,就会发现它们实际上是相同的字符串,只是从不同位置开始截取的。而这个位置的关系可以通过将 goal 复制一份连接到自身末尾来体现。

举个例子:假设 s = "abcde",将 s 左移两位得到的新字符串是 s' = "cdeab"。那么将 goal 复制一份连接到自身末尾,得到的字符串是 goal + goal = "cdeababcde"。我们可以发现,在 goal + goal 中,第一个 goals' 是对应的,因为它们都是从 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巩固练习:旋转字符串、字符串轮转的更多相关文章

  1. leetcode——Reverse Words in a String 旋转字符串中单词顺序(AC)

    题目例如以下: Given an input string, reverse the string word by word. For example, Given s = "the sky ...

  2. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  3. c算法:字符串查找-KMP算法

    /* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...

  4. 【字符串】KMP字符串匹配

    百度百科 Definition \(KMP\)算法是一个字符串匹配算法.他接收两个字符串\(A,B\),返回\(B\)在\(A\)中出现的所有位置. 以下称需要被匹配的串\(A\)为主串,可能在主串中 ...

  5. Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)

    Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...

  6. 【字符串】KMP

    Algorithm Task 给定一个文本串 \(S\) 和一个模式串 \(T\),求 \(T\) 在 \(S\) 中出现的所有位置. Limitations 要求时空复杂度均为线性. Solutio ...

  7. 算法数据结构 | 只要30行代码,实现快速匹配字符串的KMP算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法数据结构专题的第29篇文章,我们来聊一个新的字符串匹配算法--KMP. KMP这个名字不是视频播放器,更不是看毛片,它其实是由Kn ...

  8. [LeetCode]1249. 移除无效的括号(字符串,栈)

    题目 给你一个由 '('.')' 和小写字母组成的字符串 s. 你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效. 请返回任意一个合法字符 ...

  9. HDOJ-1358(字符串压缩+KMP)

    Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...

  10. scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

随机推荐

  1. 自建邮箱服务器 EwoMail 发送邮件的办法

    总结来源: http://doc.ewomail.com/docs/ewomail/changguipeizhi 1. 首先这个机器不能安装dovecot等软件,不然安装脚本会失败. 2. 下载安装文 ...

  2. [官网]Apache Log4j2 最新版安全提示 2.17.0

    https://logging.apache.org/log4j/2.x/ 最近一个周的时间 log4j2 从 2.14 跃升到了2.17 还在不停的升级 安全问题正是焦头烂额 free softwa ...

  3. 【K哥爬虫普法】你很会写爬虫吗?10秒抢票、10秒入狱,了解一下?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  4. 【K哥爬虫普法】字节前高管,离职后入侵今日头条数据库,是阴谋、还是利诱?

    案情介绍 2016年至2017年间,张洪禹.宋某.侯明强作为被告单位上海晟品网络科技有限公司主管人员,在上海市共谋采用技术手段抓取北京字节跳动网络技术有限公司(办公地点位于本市海淀区北三环西路43号中 ...

  5. 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  6. (数据科学学习手札157)pandas新增case_when方法

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,pandas在前不久更新的2. ...

  7. gRPC学习小札

    gRPC 前言 为什么使用gRPC 传输协议 传输效率 性能消耗 gRPC入门 gRPC流 证书认证 使用根证书 gRPC实现token认证 和Web服务共存 验证器 REST接口 grpcurl工具 ...

  8. Pytorch分布式训练,其他GPU进程占用GPU0的原因

    问题 最近跑师兄21年的论文代码,代码里使用了Pytorch分布式训练,在单机8卡的情况下,运行代码,出现如下问题. 也就是说GPU(1..7)上的进程占用了GPU0,这导致GPU0占的显存太多,以至 ...

  9. 21.14 Python 实现Web指纹识别

    在当今的Web安全行业中,识别目标网站的指纹是渗透测试的常见第一步.指纹识别的目的是了解目标网站所使用的技术栈和框架,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识 ...

  10. C/C++ 常用排序算法整理

    (伪)冒泡排序算法: 相邻的两个元素之间,如果反序则交换数值,直到没有反序的记录为止. #include <stdio.h> void BubbleSort(int Array[], in ...