int sunday(string str, string pattern) {
int str_len = str.length();
int pat_len = pattern.length(); int char_pos[];
for (int i = ; i<; i++) char_pos[i] = -; for (int i = pat_len - ; i>=; i--) char_pos[pattern[i]] = i; int i = ;
int j = ; while (i + pat_len <= str_len) {
while (j < pat_len && str[i] == pattern[j]) {
i++, j++;
}
if (j == pat_len) return i - pat_len; int k = i + pat_len - j;
int p = ; while ( k < str_len && (p = char_pos[str[k]]) == -) {
k += pat_len;
} i = k - p;
j = ;
}
return -;
}

比KMP好理解多了

参考:

http://www.cnblogs.com/lbsong/archive/2012/05/25/2518188.html

简化:

 int sunday(const char* pattern, const char* str) {
if (pattern == NULL || str == NULL) {
return -;
}
int slen = , plen = ; while (pattern[plen] != '\0') plen++;
while (str[slen] != '\0') slen++; int tbl[];
for (int i=; i<; i++) tbl[i] = -;
for (int i=; i<plen; i++) tbl[pattern[i]] = i; int pi = , si = ; while (si < slen) {
while (str[si] == pattern[pi] && si < slen) si++, pi++;
if (pi == plen) return si - plen;
int nidx = plen - pi + si;
int offset = tbl[str[nidx]];
si = nidx - offset;
pi = ;
}
return -;
}

最新文章

  1. 生成随机id对比
  2. 【PHP面向对象(OOP)编程入门教程】12.重载新的方法(parent::)
  3. ognl表达式root中取值顺序
  4. 深入认识JavaScript 中的this指针
  5. javascript之值传递与引用传递
  6. Spring 事务管理原理探究
  7. A Tour of Go Type conversions
  8. matlab两种不同模式的并行运算
  9. hadoop_集群安装_1
  10. 備份Sqlite DB到XML文件:
  11. updatepanel的用法之triggers
  12. JavaScript数据类型 Math对象详解
  13. Python3.6 Schedule模块定时任务
  14. 016_nginx运维问题总结
  15. Rsync同步设置的一例
  16. 解决SHAREJPOINT 跨域问题
  17. leetcode916
  18. Arduino和C51之串口通信
  19. android SpannableString使用详解
  20. 导入项目出现: Unable to resolve target ‘android-10′ 解决办法

热门文章

  1. spring JdbcTemplate批量插入以及单个插入时获取id
  2. Opencv --- 图像像素遍历的各种方法
  3. 冒泡排序实现(Java)
  4. WebDriverAPI(1)
  5. Maven 上传本地包到仓库 (来源于同事(gagahjt)的笔记本)
  6. Ubuntu16.04 Nvidia驱动、CUDA安装
  7. (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
  8. linux内核模块的安全
  9. Vue.js系列之二Vue实例
  10. python获取动态网站上面的动态加载的数据(selenium+Firefox)