【Implement strStr() 】cpp
题目:
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的更多相关文章
- 【WildCard Matching】cpp
题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...
- 【LRU Cache】cpp
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- 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~ ...
- 【 Sqrt(x) 】cpp
题目: Implement int sqrt(int x). Compute and return the square root of x. 代码: class Solution { public: ...
- 【Single Number】cpp
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- 【Valid Sudoku】cpp
题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- 【Next Permutation】cpp
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- 【Permutations II】cpp
题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...
随机推荐
- CentOS编译安装lamp
LAMP环境搭建(编译安装CentOS+httpd2.2+mysql5.5+php5.4) 首先准备以下压缩包 <ignore_js_op> (1)编译安装apache 1.配置防火墙,开 ...
- C#中的快捷键,可以更方便的编写代码 (转载)
C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...
- C(++)基于websocket实时通信的实现—GoEasy
c(++) websocket实时消息推送 在这里我记录一下之前如何实现服务器端与客户端实时通信: 实现步骤如下: 1. 获取GoEasy appkey. 在goeasy官网上注册一个账 ...
- ajax翻页效果模仿yii框架
ajax翻页效果,模仿yii框架. 复制代码代码如下: <!DOCTYPE html> <html> <head> <title>ajax分页_w ...
- 2)Java中的==和equals
Java中的==和equals 1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: ...
- WCF全面解析第一章 WCF 简介
1.WCF中的 "A","B","C" 介绍 我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方 ...
- stm32f103 SPI单线TX发数据来驱动LCD
有一黑白LCD,有CS/SI/SCK三线,时序满足SPI时序,但STM32的SPI有四线NSS/MOSI/SCK/MISO,这里MISO没有用到.因此可以使用SPI的单线发送模式进行驱动LCD. 关键 ...
- Python核心编程--学习笔记--9--文件和输入输出
本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...
- Objective-C关于分类、扮演、协议
-----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...
- poj 1459 Power Network
题目连接 http://poj.org/problem?id=1459 Power Network Description A power network consists of nodes (pow ...