【LeetCode】796. 旋转字符串
2021/8/17 23:09:35
本文主要是介绍【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算法
这篇关于【LeetCode】796. 旋转字符串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework
- 2025-01-03如果 Azure-Samples/aks-store-demo 使用了 Score 会怎样?
- 2025-01-03Apache Flink概述:实时数据处理的利器
- 2025-01-01使用 SVN合并操作时,怎么解决冲突的情况?-icode9专业技术文章分享
- 2025-01-01告别Anaconda?试试这些替代品吧
- 2024-12-31自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
- 2024-12-31自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection