翻转子串(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;
}

posted @ 2017-08-10 20:08  brucemengbm  阅读(214)  评论(0编辑  收藏  举报