翻转子串(string+KMP+程序员面试金典)
来源:互联网 发布:excel表格重复数据标红 编辑:程序博客网 时间:2024/04/28 23:34
翻转子串
- 参与人数: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
思路:可以用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;}
0 0
- 翻转子串(string+KMP+程序员面试金典)
- 《程序员面试金典》翻转子串
- 【程序员面试金典】翻转子串
- 程序员面试金典1.8:判断翻转子串
- 程序员面试金典 1.8 翻转子串
- 程序员面试金典——翻转子串
- 程序员面试金典(8):翻转子串(python)
- 《程序员面试金典》原串翻转
- 【程序员面试金典】原串翻转
- 程序员面试金典第一章:数组与字符串(8) 翻转子串
- 《Cracking the Coding Interview程序员面试金典》----翻转子串
- 程序员面试金典:翻转子串、链表中倒数第k个结点
- 原串翻转(程序员面试金典)
- 程序员面试金典 1.2 原串翻转
- 程序员面试金典题解 原串翻转
- 程序员面试金典——原串翻转
- 程序员面试金典(2):原串翻转(python)
- 《程序员面试金典》像素翻转
- 彻底理解android中的内部存储与外部存储
- css3—实现3D特效
- JavaEE_Mybatis_SpringMVC_整合开发_工作纪要
- k路归并算法的分析和实现
- Python中的shape计算矩阵
- 翻转子串(string+KMP+程序员面试金典)
- 问题之~Exuberant ctags (http://ctags.sf.net) not found in PATH
- Apahce 出现 No input file specified解决办法
- HTML5 缓存
- 2015-12-11 java 微信公众号H5支付
- 简单工厂模式
- Android仿微信朋友圈发图片和文字
- 策略模式
- spark、hive、impala、hbase、gbase在结构化数据方面查询原理对比(含parquet/orc)