CareerCup之1.8 字符串移位包含问题

简介:

【题目】

原文:

1.8 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"的旋转字符串。

【分析】

我们也可以对循环移位之后的结果进行分析。
以S1 = ABCD为例,先分析对S1进行循环移位之后的结果,如下所示:
ABCD--->BCDA---->CDAB---->DABC---->ABCD……
假设我们把前面的移走的数据进行保留,会发现有如下的规律:
ABCD--->ABCDA---->ABCDAB---->ABCDABC---->ABCDABCD……
因此,可以看出对S1做循环移位所得到的字符串都将是字符串S1S1的子字符串。如果S2可以由S1循环移位得到,那么S2一定在S1S1上,这样时间复杂度就降低了。

同样题目:编程之美之字符串移位包含问题

【代码一】

/*********************************
*   日期:2014-5-15
*   作者:SJF0115
*   题号: 字符串移位包含问题
*   来源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool isSubstring(char* str1,char* str2){
    if(str1 == NULL || str2 == NULL){
        return false;
    }
    if(strstr(str1,str2) != 0){
        return true;
    }
    return false;
}

bool IsRotate(char* str1,char* str2){
    int i,j;
    if(str1 == NULL || str2 == NULL){
        return false;
    }
    int len1 = strlen(str1);
    char* str3 = new char(len1*2+1);
    strcpy(str3,str1);
    strcat(str3,str1);
    //str3 = str1+str1
    if(isSubstring(str3,str2)){
        return true;
    }
    return false;
}

int main(){
    char str1[6] = "AABCD";
    char str2[5] = "CDAA";
    bool result = IsRotate(str1,str2);
    cout<<result<<endl;
    return 0;
}

【代码二】

/*********************************
*   日期:2014-5-15
*   作者:SJF0115
*   题号: 字符串移位包含问题
*   来源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

bool isSubstring(string str1,string str2){
    if(str1.find(str2) != string::npos) {
        return true;
    }
    return false;
}

bool IsRotate(string str1,string str2){
    string str3 = str1+str1;
    if(isSubstring(str3,str2)){
        return true;
    }
    return false;
}

int main(){
    string str1 = "apple";
    string str2 = "pleap";
    bool result = IsRotate(str1,str2);
    cout<<result<<endl;
    return 0;
}



目录
相关文章
|
6月前
leetcode-415:字符串相加
leetcode-415:字符串相加
44 0
|
存储
第一个只出现一次的字符(OJ题)
第一个只出现一次的字符(OJ题)
55 0
【Leetcode -415.字符串相加 - 434.字符串中的单词数】
【Leetcode -415.字符串相加 - 434.字符串中的单词数】
33 0
|
6月前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
6月前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
6月前
【每日一题Day203】LC1016子串能表示从 1 到 N 数字的二进制串 | 枚举 哈希表
【每日一题Day203】LC1016子串能表示从 1 到 N 数字的二进制串 | 枚举 哈希表
48 2
华为机试HJ59:找出字符串中第一个只出现一次的字符
华为机试HJ59:找出字符串中第一个只出现一次的字符
|
Serverless
华为机试HJ62:查找输入整数二进制中1的个数
华为机试HJ62:查找输入整数二进制中1的个数
004. leetcode415. 字符串相加(002)
1. 字符串中insert函数的使用(具体看这篇博客☞《从零开始实现 std::string:让你更深入地了解字符串的本质》) 2.进阶相关题(《leetcode43. 字符串相乘》)
51 0
|
存储 算法 Java
算法打卡Day27_leetcode _415字符串相加
算法打卡Day27_leetcode _415字符串相加
算法打卡Day27_leetcode _415字符串相加