首页>行业>正文
【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转
2023-05-14 22:23:56    来源:博客园

旋转字符串

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 <= 100s 和 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巩固练习:旋转字符串、字符串轮转

旋转字符串https: leetcode cn problems rotate-string 给定两个字符串,s和goal。如果在若干次旋转操作之2023-05-14

被曝裁员超1300人,福特中国回应|全球视点

红星资本局5月14日消息,近日福特中国被曝裁员,按照N& x2B;3来赔偿,人数超过1300人。针对裁员消息,福特2023-05-14

捕蛇行动 速递

1、“捕蛇行动”是指国家移民管理局组织指挥云南出入境边防检查总站通过循线侦查、专案经营和国际警务执法2023-05-14

无氟空调_关于无氟空调的介绍-新视野

1、据统计,现阶段中国至少有八成的家用空调采用R22传统制冷剂。2、R22传统制冷剂是氟利昂制冷剂中应用较多2023-05-14

全球信息:淘宝最好的学校_淘宝最好的减肥药

1、目前来说效果最好的应该是美姿 减肥胶囊,我在网上看一下,这个产品的口碑最好,纯中药成份的,最起码没有伤2023-05-14

【全球独家】苹果app store怎么改为中文_苹果app store怎么改中文

1、方法 步骤1首先打开电脑上的iTunes,点击左上角的倒三角图标,如图所示2然后在弹出的菜单栏中,选择“iTun2023-05-14

网信贵州 同心同行|百余名“网络达人”齐聚凯里 天天热闻

凯里市委常委、市委宣传部部长、市委统战部部长陆红在仪式上讲话网络文明宣传访谈5月13日,以“推进网络文2023-05-14

鄂城区消防教育进校园,花式播撒“安全种”|环球通讯

鄂城区消防教育进校园,花式播撒“安全种”---2023-05-14

​美国驻南非大使就“南非向俄罗斯提供武器”言论向南非道歉_天天速看

据央视新闻客户端消息,南非国际关系与合作部当地时间12日发表声明说,美国驻南非大使布里格蒂就此前指控2023-05-14

全球热文:周星:用一度电反赚8分钱,山东为何出现负电价?

周星:用一度电反赚8分钱,山东为何出现负电价?,电力,山东省,科学家,国家能源局,周星(1957年)2023-05-14

每日时讯!苏丹民众:冲突仍在持续 实现停火希望渺茫

总台报道员还了解到,喀土穆的水电供应仍无法得到保障。喀土穆居民 优素福:电力情况的话,有的街区有电,2023-05-14

全球观速讯丨抢抓健康消费新机遇

近年来,随着百姓健康意识提升,健康消费需求迅速增长,从过去满足基本的衣食住行需求,到今天更关注健康,2023-05-14

观察:勇士休赛期只有底薪签人,下赛季支出可能超5亿

ESPN薪资专家BobbyMarks分析了勇士休赛期的运作情况。如果德雷蒙德-格林执行价值2760万的球员选项,勇士下2023-05-14

克服困难的名言或诗句_克服困难的名言 当前独家

1、累累的创伤,就是生命给你的最好的东西,因为在每个创伤上在都标示着前进的一步。2、——罗曼·罗兰【法2023-05-14

从“没人来”到“没位置” 揭秘济南环联夜市客户回头率超99%的流量密码

海报新闻记者杜虹晓毕胜郭由济南报道如果在济南街头随意问一位市民:济南哪个夜市最值得去?90%的人会回答2023-05-14

北京新高考分数线揭晓 北京2022高考分数线公布,本科线大涨25分,释放出了哪... 当前热讯

今天,大学路小编为大家带来了北京新高考分数线揭晓北京2022高考分数线公布,本科线大涨25分,释放出了哪2023-05-14

我国海上油田群加速推进绿色化、智能化开发

央视网消息:恩平20-4海上钻采平台是恩平油田群第七个海上生产设施,恩平油田群是我国第一个在设计阶段就采2023-05-14

世界今日报丨肉体很美好,下次别为烂片露了

在情色片上,男导演和女导演能拍出两种截然不同的感觉。这取决于性别所在的视角不同。男导演大多简单粗暴,2023-05-14

全球聚焦:独库公路通车时间定了?真相是……

独库公路沿线交通运输部门目前并未发布全线通车的信息。2023-05-13

李轩辕是古代什么人物 热点评

1、因为都知道轩辕是黄帝的别号。2、所以没有敢大不敬起这样的名字。本文就为大家分享到这里,希望看了会喜2023-05-13

陕西省城镇职工养老网上服务平台 陕西省城镇职工养老网 环球观焦点

今天来聊聊关于陕西省城镇职工养老网上服务平台,陕西省城镇职工养老网的文章,现在就为大家来简单介绍下陕2023-05-13

今年进博会招展进度快于去年 溢出效应持续释放

作为中国主动向世界开放市场的重要举措,已举办了五届的进博会正在为今年的盛会加紧筹备。在5月13日的“高2023-05-13

天天微速讯:小岛你好丨深耕三毛文化IP,看这个海岛小村如何“火出圈”!

“小沙女”文创手作共富工坊。记者黄宁璐摄沿着青石板路走进三毛文化公园,只见作家三毛的铜像在阳光下熠熠2023-05-13

安徽“双创汇”走进合工大智能院 世界时讯

5月12日下午,安徽“双创汇”走进合工大智能院暨“‘科里科气’科创荟”第二十六期科技成果转化项目路演活2023-05-13

汉嘉设计:5月12日召开业绩说明会,投资者参与

2023年5月12日汉嘉设计(300746)发布公告称公司于2023年5月12日召开业绩说明会。2023-05-13