题目

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Update (2014-11-02):
The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a char * or String, please click the reload button  to reset your code definition.

代码

class Solution {
public:
int strStr(string haystack, string needle) {
const size_t len_hay = haystack.size();
const size_t len_nee = needle.size();
if ( len_hay < len_nee ) return -;
bool if_match = true;
for ( size_t i = ; i <= len_hay-len_nee; ++i )
{
if_match = true;
for ( size_t j = ; j < len_nee; ++j ){
if (haystack[i+j]!=needle[j]){
if_match = false;
break;
}
}
if ( if_match ){
return i;
}
}
return -;
}
};

Tips:

利用标志变量,暴力解决方法。时间复杂度O(m×n),空间复杂度O(1)

貌似还有个KMP算法,这个可以做到O(m+n)的时间复杂度,但是空间复杂度牺牲到了O(m)。明天再看KMP算法,这个效率的提升还是蛮高的,直接提高到了线性复杂度。

=========================================================================

这个blog讲解kmp算法挺详细的

http://blog.csdn.net/v_july_v/article/details/7041827

结合上面的blog,弄明白kmp算法,总结起来就是两点:

1. 弄明白next这个数组是怎么得来的。

2. 弄明白如何利用next数组不让haystack的指针回溯的

代码:

class Solution {
public:
int strStr(string haystack, string needle) {
int *next = new int[needle.length()];
Solution::getNext(needle,next);
size_t i = ;
size_t j = ;
while ( i<haystack.length() && j<needle.length() ){
if ( haystack[i]!=needle[j] ){
if ( next[j]==- ){
j=;
++i;
}
else{
j = next[j];
}
}
else{
++i;
++j;
}
}
return j==needle.length() ? i-j : -;
}
static void getNext(std::string needle, int next[])
{
int k = -;
next[] = k;
int len = needle.length();
int j = ;
while ( j<len- ){
if ( k==- || needle[j]==needle[k] ){
++k;
++j;
if ( needle[j]==needle[k] ){
next[j] = next[k];
}
else{
next[j] = k;
}
}
else{
k = next[k];
}
}
}
};

KMP这个算法非常精妙,总的来说就是不回溯haystack上的指针i,只移动needle上的指针j。

http://www.ituring.com.cn/article/59881

这片讲KMP的blog图画的好。

==================================================================

AC之后又回顾了整个过程,个人总结两个理解的关键点如下:

(1)

getNext中的k和j各代表什么含义?

k:不断迭代中,needle[j]之前所有元素中(不包括needle[j]),可能满足条件的最大匹配前后缀的长度(0~k-1)。这里的“条件”指的是needle[j]=needle[k]。

(2)

又想到一个问题,为什么当needle[j]!=needle[k]的时候,k=next[k]而不是--k?

原因在下面的日志中找到了(http://blog.csdn.net/thisinnocence/article/details/38544719

截取片段的红字部分是理解的关键,道理也是这个道理,但自己没有总结的这么精炼,所以直接截图引用了。

至此,KMP这个算法的序列就结束了。算法的一些细节算是吃透了,以后再巩固。

====================================================

第二次过这道题,直接放弃了KMP等算法,这个知道有就好了;只写了一个暴力解决的算法。

class Solution {
public:
int strStr(string haystack, string needle) {
if ( haystack.size()<needle.size() ) return -;
if ( needle.size()== ) return ;
for ( int i=; i<haystack.size()-needle.size()+; ++i )
{
if ( haystack[i]==needle[] )
{
bool find = true;
for ( int j=; j<needle.size(); ++j )
{
if ( haystack[i+j]!=needle[j] ) { find=!find; break; }
}
if ( find ) { return i; }
}
}
return -;
}
};

【Implement strStr() 】cpp的更多相关文章

  1. 【WildCard Matching】cpp

    题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...

  2. 【LRU Cache】cpp

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  3. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  4. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

  5. 【 Sqrt(x) 】cpp

    题目: Implement int sqrt(int x). Compute and return the square root of x. 代码: class Solution { public: ...

  6. 【Single Number】cpp

    题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...

  7. 【Valid Sudoku】cpp

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  8. 【Next Permutation】cpp

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  9. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...

随机推荐

  1. Windows Phone 开发起步之旅之二 C#中的值类型和引用类型

    今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下.  一说起来C#中的数据类型有哪些,大 ...

  2. SQL中如何检查死锁

    SQL中如何检查死锁 编写人:CC阿爸 2014-6-15 在日常SQL数据库的操作中,SQL偶尔会出现表被死锁的问题.比如: 在执行事务时,突然中止事务.系统肯定会锁表. 大批量数据操作时,由于网络 ...

  3. SDUST 作业10 Problem I 液晶显示

    Description 你的朋友刚买了一台新电脑,他以前用过的最强大的计算工具是一台袖珍计算器.现在,看着自己的新电脑,他有点失望,因为他更喜欢计算器上的LC显示器.所以,你决定写一个LC显示风格的程 ...

  4. Firebird 修改表名

    UPDATE RDB$RELATIONS SET  RDB$RELATION_NAME='NEWNAME' where RDB$RELATION_NAME='OLDNAME'; UPDATE RDB$ ...

  5. STM32F4_引领入门

    Ⅰ.概述 该文写给那些想学ST芯片开发(或初级学习)的朋友,文章着重细节,或许有点简单. 笔者想告诉那些刚开始学习ST的朋友,不管你使用哪一个系列(F0.F1.F2),哪一种型号芯片,其实学习的方法和 ...

  6. Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url

    下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...

  7. Oracle 错误代码

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  8. webpack 学习笔记 02 快速入门

    webpack 的目标 将依赖项分块,按需加载. 减少web app的初始加载时间. 使每一个静态集合都能够作为组件使用. 有能力集成第三方库,作为组件使用. 高度可配置化. 适用于大型项目. INS ...

  9. Node.js express路由简单分析

    这2天看了一点node+express的路由源码有了一点眉目,总结一下 对于app.get, 首先给出一张类图: 图1 注意每个路由有一个stack,这个stack中存放了Layer. 路由系统内有三 ...

  10. C 网页压力测试器

    引言 <<独白>> 席慕蓉 节选一 把向你借来的笔还给你吧. 一切都发生在回首的刹那. 我的彻悟如果是缘自一种迷乱,那么,我的种种迷乱不也就只是因为一种彻悟? 在一回首间,才忽 ...