CC08:翻转子串

题目

假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:

"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true

解法

自己的一个思路,就是先判断直到s1[0]与s2[i]的字符相等之时,这时有可能i就为整个字符串的偏移量,通过循环进行判断是否整个字符串与偏移后的字符串是相等的。如果不相等则跳出循环重新寻找偏移量i,如果都没有则返回false,思路还是很简单的,代码如下:

class ReverseEqual {
public:
    bool checkReverseEqual(string s1, string s2) {
        // write code here
        if(s1.size()!=s2.size())
            return false;
        for(int i=0;i<s1.size();i++)
        {
            if(s1[0]==s2[i])
            {
                for(int j=0;j<s1.size();j++)
                {
                    int temp=(j+i)%s1.size();
                    if(s1[j]!=s2[temp])
                    {
                        break;
                    }
                    else 
                    {
                      if(j==s1.size()-1)
                        return true;  
                    }
                }
            }
        }
        return false;
    }
};

然后自己在网上搜了一下别人的做法,发现大家基本上使用的是这样的解法:

    class ReverseEqual {
    public:
        bool checkReverseEqual(string s1, string s2) {
            // write code here
            if(s1.size()==0||s2.size()==0)
                return false;
            string str=s1+s1;
            if(str.find(s2)==-1)
                return false;
            return true;
        }
    };

确实这种方法非常巧妙,因为将两个s1字符串合并后就包含了s1的所有可能情况,其中之一就是s2,所以通过这样的方法进行寻找复杂度小而且代码量小,值得学习。

posted @ 2018-07-19 19:48  MrYun  阅读(146)  评论(0编辑  收藏  举报