题目

假设你有一个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. 则:

1
s1 + s1 = waterbottlewaterbottle

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include <iostream>
#include <string>
using namespace std;
bool isSubstring(string s1, string s2){
    if(s1.find(s2) != string::npos) return true;
    else return false;
}
bool isRotation(string s1, string s2){
    if(s1.length() != s2.length() || s1.length()<=0)
        return false;
    return isSubstring(s1+s1, s2);
}
int main(){
    string s1 = "apple";
    string s2 = "pleap";
    cout<<isRotation(s1, s2)<<endl;
    //cout<<string::npos<<endl;
    return 0;
}

【Java参考代码】

1
2
3
4
5
6
7
8
9
10

  public static boolean isRotation(String s1, String s2) {
     int len = s1.length();
      /* check that s1 and s2 are equal length and not empty */
     if (len == s2.length() && len > 0) {
        /* concatenate s1 and s1 within new buffer */
        String s1s1 = s1 + s1;
        return isSubstring(s1s1, s2);
    }
    return false;
  }

判断一个字符串是另外字符串的旋转字符串相关推荐

  1. java中判断一个字符在字符串中出现的次数

    源代码: //java中判断一个字符出现的次数//在下面字符串中查找有几个啊public static void testFindChar(){String str = "啊!我爱你中国!啊 ...

  2. 力扣 旋转字符串 C语言 题解

    力扣 旋转字符串 文章目录 力扣 旋转字符串 一.完整题目 二.解题思路 三.编写代码 四.测评结果 五.总结评价 一.完整题目 给定两个字符串, s 和 goal. 如果在若干次旋转操作之后,s 能 ...

  3. 62 旋转字符串(Rotate String)

    文章目录 1 题目 2 解决方案 2.1 思路 2.2 时间复杂度 2.3 空间复杂度 3 源码 1 题目 题目:旋转字符串(Rotate String) 描述:给定一个字符串str和一个偏移量,根据 ...

  4. C语言---写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

    题目: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串. #include <string.h> #include <stdio.h> void left_re ...

  5. 判断一个字符串是否为另外一个字符串旋转之后的字符串。

    ★判断一个字符串是否为另外一个字符串旋转之后的字符串. 例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA ...

  6. 判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

    题目: 判断一个字符串是否为另外一个字符串旋转之后的字符串.  例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到AB ...

  7. 判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. // // AABC

    思路 首先需要需旋转字符串,左旋字符串程序点击进入 添加链接描述 旋转之后只需要用strcmp函数进行判定即可 #include <stdio.h> #include <string ...

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

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

  9. Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符

    Java:判断一个字符串中包含指定字符子串,判断一个字符串中存在指定字符 字符串的contains方法可以判断一个字符串中是否存在另一个字符子串,示例如下 String Str = "Hel ...

最新文章

  1. 拒绝遗忘:高效的动态规划算法
  2. ccna第四学期final一二三套题
  3. python事件驱动编程_Python事件驱动编程
  4. [转]高效编程之欲擒故纵
  5. ssis mysql to server_SSIS:将表从MySQL复制到SQL Server 2008
  6. JSON.parse 解析json字符串时,遇换行符报错
  7. CloudComputing是什么
  8. GIL锁,线程锁(互斥锁)和递归锁
  9. Tsung压力测试工具的搭建和使用,配置。
  10. 脚注交叉引用序号不一样_著作权合理使用制度之“适当引用”的界定
  11. Unity Mask制作圆形头像
  12. 同步传输和异步传输原理与比较
  13. SSD硬盘SATA接口和M.2接口区别(详细)总结
  14. 第十章 决策树与随机森林
  15. swf格式的视频怎么转换成mp4
  16. 阿里云国际站:阿里云发布云数据中心专用处理器
  17. Android Studio 运行HyperLPR开源项目安卓APP
  18. Anki 记忆工具使用方法
  19. 如何写好数据库CRUD?
  20. stram流两个list的交集差集

热门文章

  1. 每日一皮:年轻时的你,是不是也各种重构欲望?
  2. 最新最全!阿里等宣布再次延迟复工,有您们公司嘛?
  3. 线程同步 生产者消费者 java_Java线程同步:生产者-消费者 模型(代码示例)
  4. python类的函数_python 类函数
  5. 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
  6. 使用DBLINK为远程数据库的用户表创建同义词
  7. vmmem 内存占用高
  8. c++ softmax sigmoid
  9. dll function 'xxx' not found
  10. too many indices for tensor of dimension 3