面试题 01.09. 字符串轮转

原题目

面试题 01.09. 字符串轮转

字符串轮转。给定两个字符串s1s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottleerbottlewat旋转后的字符串)。

示例1:

 输入:s1 = "waterbottle", s2 = "erbottlewat"
 输出:True

示例2:

 输入:s1 = "aa", s2 = "aba"
 输出:False

提示:

  1. 字符串长度在[0, 100000]范围内。

说明:

  1. 你能只调用一次检查子串的方法吗?



第一遍解法

思路:通过遍历找到s2中对于s1首字符的位置 j。然后从i, j开始依次比较,如果全部相等,则返回true,否则返回false。

(有点麻烦,可直接看下面网上的解法)

class Solution {
public:
    bool isFlipedString(string s1, string s2) {
        if (s1.size() != s2.size()) { return false; }
        if (s1 == "" && s2 == "") { return true; }
        int i = 0, j = 0, js = 0, cnt = 0;
        while (js < s2.size()) {
            while(s1[i] == s2[j] && cnt < s2.size()) {
                i++;
                j = (j + 1) % s2.size();
                cnt++;
            }
            if (cnt == s2.size()) {
                return true;
            }
            cnt = 0;
            js += 1;
            j = js;
            i = 0;
        }
        return false;
    }
};



网上好的解法

若两个字符串可以轮转得到,则s2肯定在s1 + s1的子集内。(没想到竟然如此简洁)

class Solution {
public:
    bool isFlipedString(string s1, string s2) {
        return s1.size() == s2.size() && (s1+s1).find(s2) != -1;
    }
};

作者:cui-tian-xiao
链接:https://leetcode-cn.com/problems/zero-matrix-lcci/solution/cjie-fa-ling-ju-zhen-9kai-pi-xin-bu-er-shu-zu-by-c/
来源:力扣(LeetCode)

查找子串应该是用的KMP算法,所以

时间复杂度: O(M+N)

空间复杂度: O(1)



最后的代码

跟第一次解法一致。

class Solution {
public:
    bool isFlipedString(string s1, string s2) {
        return s1.size() == s2.size() && (s1+s1).find(s2) != -1;
    }
};



小结

  • 等于一些题目,如果快速有一个思路,但比较复杂实现。不如多花几分钟想想有没有“奇淫”的方法。
  • string的find函数用于查找子串,若查找失败返回-1。
posted @ 2020-12-21 22:50  Cigar丶  阅读(97)  评论(0编辑  收藏  举报