问题描述

实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

问题分析

  • 第一种方法:暴力方法,直接双层遍历,在最外层遍历只遍历到n-m+1而不是到n,因为needle的长度为m,后面肯定匹配不上。
  • 第二种方法:Sunday方法,通过记录一个偏移表,防止内层循环还要从头开始遍历。
    • Sunday算法对偏移量定义为:每个字符在串中最后出现的位置。
    • 对匹配规则是这样规定的:
      • 若匹配不成功:

        • 如果匹配串的后一个元素不在模式串中,那么只需要直接在后一个元素之后匹配即可,即游标移动一个模式串长度。
        • 如果匹配串的后一个元素在模式串中,则偏移到对齐位置,再进行比较。
      • 若匹配成功,则返回当前游标。

代码1

class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size() == 0) return 0;
int n = haystack.size();
int m = needle.size(),i,j,tmp;
if(n < m) return -1;
char c = needle[0];
for(i = 0; i < n-m+1; i++)
{
if(haystack[i] == c)
{
tmp = i;
for(j = 1; j < m;j++)
{
if(haystack[++tmp] != needle[j])
break;
}
if(j == m)return i;
}
}
return -1;
}
};

结果1

执行用时 :8 ms, 在所有 C++ 提交中击败了58.33%的用户
内存消耗 :9.2 MB, 在所有 C++ 提交中击败了32.48%的用户

代码2

class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size() == 0) return 0;
int n = haystack.size();
int m = needle.size(),i;
if(n < m) return -1;
map<char,int> table;
for(i = m-1; i >= 0; i--)//构造偏移表
if(table.find(needle[i]) == table.end())
table.insert(pair<char,int>(needle[i],m-i));
for(i = 0; i<n-m+1;)
{
if(haystack.substr(i,m) != needle)
{
if(table.find(haystack[i+m]) == table.end())
i = i + m + 1;//不配配
else
i = i + table.find(haystack[i+m])->second;
}
else
return i;
}
return -1;
}
};

结果2

执行用时 :4 ms, 在所有 C++ 提交中击败了93.65%的用户
内存消耗 :9.6 MB, 在所有 C++ 提交中击败了6.78%的用户

最新文章

  1. django tag
  2. 几个 Ceph 性能优化的新方法和思路(2015 SH Ceph Day 参后感)
  3. spring事务配置详解
  4. android Adapter剖析理解
  5. Nexus4铃声目录
  6. Windows IP安全策略。
  7. 计数方法(扫描线):JLOI 2016 圆的异或并
  8. android笔记1——开发环境的搭建
  9. Android 圆形背景shape定义
  10. List&lt;int&gt;是值类型还是引用类型
  11. hdoj 1251 统计难题(字典树)
  12. angularjs中sortable的使用
  13. Linux文件管理下
  14. CSS样式之表格,表单
  15. JHipster简介
  16. python 实现网页 自动登录
  17. slf4j的简单用法以及与log4j的区别
  18. Golang中使用kafka
  19. Notes of Daily Scrum Meeting(12.3)
  20. Java如何使用线程解决生产者消费者问题?

热门文章

  1. CF1099A Snowball 题解
  2. java 数据类型:集合接口Collection之 Stream 的reduce方法
  3. Mybatis一对一、一对多级联查询使用
  4. 【LeetCode】1472. 设计浏览器历史记录 Design Browser History (Python)
  5. 《Java必须知道的300个问题》读书总结
  6. 【LeetCode】 258. Add Digits 解题报告(Java & Python)
  7. 【九度OJ】题目1177:查找 解题报告
  8. 【LeetCode】525. Contiguous Array 解题报告(Python & C++)
  9. 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)
  10. Codeforces 777E:Hanoi Factory(贪心)