翻转子串(string+KMP+程序员面试金典)

翻转子串
  • 参与人数:1197时间限制:3秒空间限制:32768K
  • 通过比例:35.03%
  • 最佳记录:0 ms|8552K(来自 )

题目描述

假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。

给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。

测试样例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
链接:http://www.nowcoder.com/practice/bc12808a2b0f445c96a64406d5513e96?rp=1&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking  

思路:可以用string 的标准库函数,也可以自己写>>KMP算法<<。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

class ReverseEqual {
public:
/*    bool checkReverseEqual(string s1, string s2) {
        if(s1.size()!=s2.size() || s1.size()==0 || s2.size()==0)
            return false;
        s1+=s1;
        /**用来表示不存在的位置,类型一般是std::container_type::size_type许多容器都提供这个东西。
        取值由实现决定,一般是-1,这样做,就不会存在移植的问题了。
        if(s1.find(s2)==string::npos)//npos是一个常数
            return false;
        else return true;
    }*/
    void getnext(string &s,vector<int> &next)
    {
        int i=0,k=-1;
        next[0]=-1;
        while(i<s.size())
        {
            if(k==-1||s[i]==s[k])
            {
                i++;
                k++;
                next[i]=k;
            }
            else
                k=next[k];
        }
    }
    bool kmp(string &t,string &s,vector<int> &next)
    {
//        auto iter=next.begin();
//        while(iter!=next.end())
//            cout<<*iter++<<" ";
//        cout<<endl;
        int i=0,j=0;
//        cout<<t<<" "<<"s1.size()="<<t.size()<<" "<<s<<" "<<"s2.size()="<<s.size()<<endl;
        int lens=s.size();
        int lent=t.size();//查了这么久,为什么会这样
        while(i<lent && j<lens)//while(i<t.size() && j<s.size())
        {
            if(j==-1||s[j]==t[i])
            {
                i++;
                j++;
            }
            else
                j=next[j];
//            printf("i=%d\tj=%d\n",i,j);

        }
        if(j!=s.size()) return false;
        else
        {
//            s[j]='\0';
//            cout<<s<<" "<<j<<endl;
            return true;
        }
    }
    bool checkReverseEqual(string s1, string s2) {
        if(s1.size()!=s2.size() || s1.size()==0 || s2.size()==0)
            return false;

        vector<int>next(s2.size()+1);
        getnext(s2,next);
        s1+=s1;
 //       cout<<s1<<endl;
        return kmp(s1,s2,next);
    }
};

void Judge(string &s1,string &s2)
{
    ReverseEqual RE;
    if(RE.checkReverseEqual(s1,s2))    cout<<"true"<<endl;
    else cout<<"false"<<endl;
}
int main()
{

    string s1("Hello world"),s2("worldhello");
    string s3("water bottle"),s4("er bottlewat");
    string s5("bwdyorsngiayocsksyybigrvqxtvhmfyyhmbhhlcenxalcpodllikancwwqbdfrfpcjftfknrekmvdkugdljtlrjcwlwwmswucgebmmsovdezsqtuohnnjjeqyhsnyumngxlgulsiclfrtzzynawgraqctkhrjluykmfujhrwgcgybhaulhmskstwjvgfmofxeuflkkqajialclnlzggccqwdgpkiiobpzgnipliekufylogjrarvxdwslnkwczfltveebzcrjcttxpizhsweeogsixegkwhfwtmtngqjhgkwduahgyyjxihuyxlsksfzpzikdnqvsgyzisnmqgdymkglbtuhjpxhbeybiewrvbdabprqzpvsvdejahfqsnvoijyypmmhpcpbjsukftobgnzxbdltfdfwjk");
    string s6("yypmmhpcpbjsukftobgnzxbdltfdfwjDbwdyorsngiayocsksyybigrvqxtvhmfyyhmbhhlcenxalcpodllikancwwqbdfrfpcjftfknrekmvdkugdljtlrjcwlwwmswucgebmmsovdezsqtuohnnjjeqyhsnyumngxlgulsiclfrtzzynawgraqctkhrjluykmfujhrwgcgybhaulhmskstwjvgfmofxeuflkkqajialclnlzggccqwdgpkiiobpzgnipliekufylogjrarvxdwslnkwczfltveebzcrjcttxpizhsweeogsixegkwhfwtmtngqjhgkwduahgyyjxihuyxlsksfzpzikdnqvsgyzisnmqgdymkglbtuhjpxhbeybiewrvbdabprqzpvsvdejahfqsnvoij");
    string s7("byyjk");
    string s8("yyjkb");
    Judge(s1,s2);
    Judge(s3,s4);
    Judge(s5,s6);
    Judge(s7,s8);
	return 0;
}

你可能感兴趣的:(String,KMP,程序员面试金典,翻转子串)