题目

请设计一个线性时间的算法,判断字符串 S 是否是另一个字符串 S’ 的循环旋转。例如, arc和car是彼此的循环旋转。

思路分析

  1. S 和 S’ ​长度不等时,肯定不是循环旋转
  2. 将 S 扩大到两倍,相当于变为 S=S+S(例如arc变为arcarc),如果S’ 是新生成的S的子串,那么S’ 是S的循环旋转,否则,不是循环旋转。
  3. 因为要求线性时间的算法,所以判断是否是字串时,用KMP匹配算法

C++代码

#include<iostream>
#include <algorithm>
#include <string>
using namespace std;//计算字符串特征向量(优化版)
int* findNext(string P) {int i, k;int m = P.length();                  // m为模式P的长度int* next = new int[m];             // 动态存储区开辟整数数组next[0] = -1;i = 0; k = -1;while (i < m - 1) {                  // 若写成 i < m 会越界while (k >= 0 && P[k] != P[i])  // 采用 KMP 找最大首尾子串k = next[k];              // k 递归地向前找i++;k++;if (P[k] == P[i])next[i] = next[k];           // 前面找 k 值,没有受优化的影响elsenext[i] = k;             // 取消if判断,则不优化}return next;
}//KMP匹配
int KMPStrMatching(string T, string P, int* N) {int i = 0;int j = 0;int tLen = T.length(); // 目标的长度int pLen = P.length(); // 模式的长度if (tLen < pLen) // 若目标比模式短,匹配无法成功return -1;while (i < tLen && j < pLen) { // 反复比较,进行匹配if (j == -1 || T[i] == P[j])i++, j++;else j = N[j];    // 不相等,按照特征向量调整}if (j >= pLen)return (i - pLen); // 注意仔细算下标elsereturn -1;
}int main() {string s1, s2;cin >> s1 >> s2;if (s1.length() != s2.length()) {cout << "No";return 0;}s1 = s1 + s1;int* next = new int[100];next = findNext(s2);if (KMPStrMatching(s1, s2, next) == -1)cout << "No";elsecout << "Yes";
}

数据结构(字符串)—— 循环旋转字符串的判断相关推荐

  1. 判断一个字符串是另外字符串的旋转字符串

    题目 假设你有一个isSubstring函数,可以检测一个字符串是否是另一个字符串的子串. 给出字符串s1和s2,只使用一次isSubstring就能判断s2是否是s1的旋转字符串, 请写出代码.旋转 ...

  2. 【字符串】旋转字符串

    题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串"abcdef"前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串" ...

  3. 经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

    题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given tw ...

  4. java循环左一_左旋转字符串(Java)-循环Index方式

    左旋转字符串(Java)-循环Index方式 题目要求 ​ 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循 ...

  5. 【字符串的定义】【判断类型】【查找和替换】【大小写转换】【文本对齐】【去除空白字符】【拆分和连接】【字符串切片重点】【倒序切片】【内置函数】【for 循环语法 break】

    文章目录 字符串的定义 字符串的常用操作 判断类型 - 9 查找和替换 - 7 大小写转换 - 5 文本对齐 - 3 去除空白字符 - 3 拆分和连接 - 5 字符串的切片 重点 索引的顺序和倒序 * ...

  6. 数据结构与算法--3.字符串的旋转

    题目: A是含有n个元素的数组,如果可以申请到最大内存,那么把A从位置i开始旋转是比较简单的.例如:A:a,b,c,d,e.其中i=3,旋转后的字符串A为:d,e,a,b,c 要求设计一个时间复杂度为 ...

  7. 旋转字符串算法由浅入深

    昨天在写一个旋转字符串的函数时,写着写着发现有好多种方法,最简单的莫过于替换然后覆盖再插入.不要小看这种小的算法,其实这其中蕴含着很多容易忽略的编程的细节.下面就跟随着我的文字来由浅入深进行巩固和再学 ...

  8. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  9. LeetCode简单题之旋转字符串

    题目 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能 ...

最新文章

  1. 前端面试官,我为什么讨厌你。
  2. 《包容的智慧》读后感-包容有多少,拥有就有多少
  3. spring(16)------spring的数据源配置
  4. QT集成QML和JavaScript
  5. MySQL使用技巧收集,持续更新中......
  6. LeetCode 100. Same Tree
  7. ASP.NET验证控件之RegularExpressionValidator
  8. java calendar获取年_Java Calendar获取年、月、日、时间,设置年、月、日
  9. Atitit 网关协议cgi wsgi fcgi fastcgi 目录 1.1. CGI(common gateway unterface) 1 1.2. 2.1 WSGI: 1 1.3. 2.3
  10. error:there‘s no Qt version assigned to project please assign a Qt installation in qt project settin
  11. 西威变频器 服务器显示,西威变频器故障查询及操作方法;
  12. mysql udal_mysql分表分区
  13. java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程
  14. 启动Intel TV-x设置
  15. python软件-mPython(图形化编程软件) V0.5.0 官方版
  16. web课程设计网页规划与设计:摄影/拍摄/相片网站设计——摄影网(12页)HTML+CSS+JavaScript div+css网页html成品学生作业
  17. python发短信验证码_python利用第三方模块,发送短信验证码
  18. 【分享】新浪微博、QQ分享、微信分享的申请过程
  19. RISC领域ARM不是唯一
  20. 学习HM微博项目第2天

热门文章

  1. 获取指定存储过程的参数定义
  2. 追加easyui元素,完成后调用$.parser.parse()方法渲染
  3. CF11D A Simple Task(状压DP)
  4. php与web页面交互
  5. java GC的优化
  6. C# Lodop实现打印
  7. 将日期变为中文星期几
  8. MYSQL绿色安装过程
  9. 一步步构建大型网站架构(转载)
  10. vs2010 c# 配置项问题