翻转子串
  • 參与人数: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+程序猿面试金典)的更多相关文章

  1. 翻转子串 牛客网 程序员面试金典 C++ Python

    反转子串 牛客网 程序员面试金典 C++ Python 题目描述 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查 ...

  2. 原串反转 牛客网 程序员面试金典 C++ Python

    原串反转 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniS ...

  3. leetcode:程序猿面试技巧

    起因 写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然非常多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有非常多不清楚的地方,于是有了对于每道题 ...

  4. 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的

    在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象.    Java程序的初始化一般遵循以下三个原则(以下 ...

  5. 《Java程序猿面试笔试宝典》之 什么是AOP

    AOP(Aspect-Oriented Programming.面向切面编程)是对面向对象开发的一种补充,它同意开发者在不改变原来模型的基础上动态地改动模型从而满足新的需求.比如.在不改变原来业务逻辑 ...

  6. 《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么

    在Java语言中.字符串起着非常关键的数据.字符串的声明与初始化主要有例如以下两种情况:(1) 对于String s1=new String("abc")语句与String s2= ...

  7. java程序猿面试系列之jvm专题

    前言 因为疫情的影响,现在都变成金五银六了.为了方便大家,在此开一个程序猿面试系列.总结各大公司所问的问题,希望能够帮助到大家,适合初中级java程序猿阅读. 1. Java类实例化时,JVM执行顺序 ...

  8. 二进制小数 牛客网 程序员面试金典 C++ Python

    二进制小数 牛客网 程序员面试金典 题目描述 有一个介于0和1之间的实数,类型为double,返回它的二进制表示.如果该数字无法精确地用32位以内的二进制表示,返回"Error". ...

  9. 字符串压缩 牛客网 程序员面试金典 C++ Python

    字符串压缩 牛客网 程序员面试金典 C++ Python 题目描述 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变 ...

随机推荐

  1. Qt 4.7.2移植到ARM教程

    Qt的移植包括步骤如下: 1.下载并安装VMware WorkStation 12(最好比较高级的版本,早期的版本共享目录在虚拟机里可能显 示不了). 2.下载ubuntu 14.0.4(最好是lts ...

  2. java8函数式接口小例子

    // Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.o ...

  3. HDU 4499 Cannon (搜索)

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  4. USB PIC Programmer (Brenner8)

    http://uzzors2k.4hv.org/index.php?page=usbpicprog My Tait Serial programmer works alright, but not e ...

  5. 【Go入门教程7】面向对象(method、指针作为receiver、method继承、method重写)

    前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...

  6. 写给在Java和.net中徘徊的新手

    在很多网站上,网友都会问一个相同的问题,到底是学Java还是.net,个有个的见解. 自从.Net问世以来,程序员都很关心的一个问题是「该学Java或.NET」.我也在挣扎,该「该继续Java的研究, ...

  7. 使用Bootstrap 3开发响应式网站实践06,使用ListGroup、Thumbnails展示内容

    □ ListGroup展示内容 当希望把同类型的内容以列表.区块展示的时候,ListGroup是不错的选择. <div class="col-sm-6"> <h3 ...

  8. C#编程(四)

    原文地址:http://blog.csdn.net/shanyongxu/article/details/46400067 C#预定义数据类型 C#中的可用类型以及及其定义非常严格,C#中获得数据类型 ...

  9. Pycharm配置autopep8让Python代码更符合pep8规范

    一.何为pep8? PEP 8官方文档 -- Style Guide for Python Code PEP8中文翻译(转) 二.Pycharm中配置pep8 Pycharm本身是有pep8风格检测的 ...

  10. android studio 引用aar

    在:libs拷贝对应的文件 build.gradle repositories {    flatDir {        dirs 'libs'    }}dependencies {   // c ...