题目

Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., “waterbottle” is a rotation of “erbottlewat”).

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

解答

题目说我们使用一次isSubstring函数就可以判断s2是否是s1的旋转字符串, 如果从原始字符串s1和s2直接入手肯定不行,因为它们根本不存在子串关系。 如果不断地旋转字符,然后调用isSubstring,又需要调用多次的isSubstring。 而且通过旋转字符再判断,可以直接用等号判断,根本用不上isSubstring。

既然如此,我们就要考虑去改变原始字符串。要判断a串是否是b串的子串, 一般情况下都会有b串长度大于a串,长度相等的话就直接判断它们是不是相等的串了。 我们可以考虑把串s1变长,然后调用一次isSubstring判断s2是否是s1变长后的子串, 如果是,就得出s2是s1的旋转字符串。s1怎么变长呢?无非就是s1+s1或是s1+s2, s2一定是s1+s2的子串,因此这样做没有任何意义。而s1+s1呢? 我们就上面的例子进行讨论:s1=waterbottle,s2=erbottlewat. 则:

s1 + s1 = waterbottlewaterbottle

很容易可以发现,s1+s1其实是把s1中每个字符都旋转了一遍,而同时保持原字符不动。 比如waterbottle向右旋转2个字条应该是:terbottlewa,但如果同时保持原字符不动, 我们得到的就是waterbottlewa,而terbottlewa一定是waterbottlewa的子串, 因为waterbottlewa只是在terbottlewa的基础上再加上一条原字符不动的限制。 因此s1+s1将包含s1的所有旋转字符串,如果s2是s1+s1的子串,自然也就是s1 的旋转字符串了。

首先,我们来了解一个函数:
a.find(b) 表示查找字符串a是否包含子串b,若查找成功,返回按查找规则找到的第一个字符或子串的位置;若查找失败,返回npos,即-1(打印出来为4294967295)。

接下来,利用这个函数,我们可以很方便的写出判断s2是否是s1的旋转字符串的代码。

关键代码:

//判断s2是不是s1的子串
bool isSubstring(string s1, string s2){if(s1.find(s2) != string::npos) return true;else return false;
}//防范一下,以及调用:isSubstring(s1+s1, s2)
bool isRotation(string s1, string s2){if(s1.length() != s2.length() || s1.length()<=0)return false;return isSubstring(s1+s1, s2);
}

完整代码:

#include <iostream>
#include <string>
using namespace std;bool isSubstring(string s1, string s2){//a.find(b)查找字符串a是否包含子串b。string::npos(很大的无符号整数)也可以认为就是-1。if(s1.find(s2) != string::npos) return true;else return false;
}
bool isRotation(string s1, string s2){//防范一下!如果s2的长度和s1的不相等,肯定就不可能s2是s1的旋转子串了。if(s1.length() != s2.length() || s1.length()<=0)return false;return isSubstring(s1+s1, s2);
}int main(){string s1 = "apple";string s2 = "pleap";if(isRotation(s1, s2)){cout<<s2+"是"+s1+"的旋转字符串"<<<<endl;}//cout<<string::npos<<endl; //4294967295//cout<<s1.find(s2)<<endl;  //4294967295return 0;
}

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

  1. 经典算法面试题目-设计算法移除字符串中重复的字符(1.3)

    题目 Design an algorithm and write code to remove the duplicate characters in a string without using a ...

  2. 经典算法面试题目-置矩阵行列元素为0(1.7)

    题目 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is se ...

  3. 经典算法面试题目-翻转一个C风格的字符串(1.2)

    题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as ...

  4. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  5. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

  6. 程序员面试题目:请实现一个函数,把字符串中的每个空格替换成20。

    来源:我是码农,转载请保留出处和链接! 本文链接:http://www.54manong.com/?id=1223 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如 ...

  7. JAVA经典算法面试40题及答案

    By Lee - Last updated: 星期日, 三月 9, 2014 现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力 ...

  8. 经典.NET面试题目

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private :   私有成员, 在类的内部才可以访问.       protect ...

  9. BATJ经典软件测试面试题目(内附答案)

    Time will tell(时间会证明一切). 题目 一.单项选择题,共20小题 二.判断题,共10小题 三.填空题,共10小题20个空 四.名词解释,共5小题 五.简答题,共3小题 六.综合题 一 ...

最新文章

  1. 【转载】Asp.Net MVC3网站并成功的连接了MongoDB
  2. 中等职业学校计算机教学方法,浅析中等职业学校“计算机基础课”教学方法.doc...
  3. 配置PIX515E DMZ的基本方法与故障排除
  4. java23种设计模式之五:代理模式
  5. Qt图形界面编程入门(标签与槽机制习题分享)
  6. 专业即时通讯工具的SEO人生发力
  7. pycharm操作指北
  8. postman websocket_postman的“替代者”postwoman的使用体验—从入门到放弃
  9. cmd命令关闭占用程序的端口
  10. infortrend ESDS RAID6故障后的数据恢复方案
  11. 洛谷3374:树状数组1(线段树/树状数组模板)
  12. 高并发高可用高性能的解决方案
  13. webView 修改背景颜色
  14. RAW 图像格式转换工具 bayer2rgb
  15. idea pom引入依赖 Dependency ‘xxx‘ not found less... (Ctrl+F1) Inspect
  16. 在虚拟机linux系统中安装与配置jdk
  17. C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....
  18. 圆周率用计算机能算出来不,圆周率到底能不能算尽?人类拿超级计算机算了,结果不敢相信!...
  19. 微信小程序和uniapp开发工具
  20. IPFS发展前景真有说的那么好么?

热门文章

  1. Windows2003 IIS安装
  2. leetcode 454 四数相加
  3. 设计模式第七讲-责任链模式
  4. 如何更高效的管理原生微服务应用
  5. oracle菜鸟学习之 分析函数-排序
  6. nginx 日志切割
  7. HashMap实现原理
  8. Yii 2 —— Model表前缀
  9. Dot Net设计模式—外观模式
  10. Ajax 和 XML: 五种常见 Ajax 模式