zoukankan      html  css  js  c++  java
  • 翻转子串(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	j=%d
    ",i,j);
    
            }
            if(j!=s.size()) return false;
            else
            {
    //            s[j]='';
    //            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;
    }

  • 相关阅读:
    bootstrap-datetimepicker 十年视图、年月视图 附源码
    java面向对象程序设计的五个特性
    简述rtsp,rtmp,http三个协议
    iOS 实现毛玻璃效果
    一个裁剪图片的小工具类,通过一句代码调用
    iOS 中的正则匹配(工具类方法)
    博客园不支持Markdown语法,新博客将发在简书...
    一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存
    仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-10系统,3行代码即可集成.
    分享一下我封装iOS自定义控件的体会,附上三个好用的控件Demo <时间选择器&多行输入框&日期选择器>
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7341178.html
Copyright © 2011-2022 走看看