【LeetCode】796. 旋转字符串

796. 旋转字符串

知识点:字符串;KMP算法

题目描述

给定两个字符串, A 和 B。

A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

示例
示例 1: 输入: A = 'abcde', B = 'cdeab' 输出: true 示例 2: 输入: A = 'abcde', B = 'abced' 输出: false

解法一:暴力法

依次后移依次比较

class Solution { public boolean rotateString(String s, String goal) { if(s.length() != goal.length()) return false; if(s.length() == 0) return true; search: for(int i = 0; i < s.length(); i++){ //旋转的次数; for(int j = 0; j < goal.length(); j++){ if(s.charAt((i+j) % s.length())!= goal.charAt(j)){ continue search; //匹配不上直接比较下一次旋转; } } return true; } return false; } }

解法二:API

其实A+A里就包含了所有A进行旋转的结果,所以只要判断B是否是A的子串就可以了,而String类含有contains方法;

class Solution { public boolean rotateString(String s, String goal) { return (s.length() == goal.length()) && ((s+s).contains(goal)); } }

解法三:KMP算法

按照上面的分析,如果把A拓展成为A+A,那这道问题就变成了在A+A中是否含有B的子串,这是经典的字符串匹配问题,最经典的当属于KMP算法。

class Solution { public boolean rotateString(String s, String goal) { int n = goal.length(); int[] next = buildNext(goal, n); if(s.length() != goal.length()) return false; int i = 0; int now = 0; String news = s+s; while(i < news.length()){ if(news.charAt(i) == goal.charAt(now)){ i++; now++; }else if(now != 0){ now = next[now-1]; }else{ i++; } if(now == goal.length()){ return true; } } return false; } private int[] buildNext(String str, int n){ int[] next = new int[n]; int now = 0; int i = 1; while(i < n){ if(str.charAt(i) == str.charAt(now)){ now++; next[i] = now; i++; }else if(now != 0){ now = next[now-1]; }else{ next[i] = 0; i++; } } return next; } }

相关题目

28. 实现 strStr()

相关链接

KMP算法


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15154286.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(362)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】796. 旋转字符串』
点击右上角即可分享
微信分享提示