目录

  • 题目

    • 描述
    • 输入
    • 输出
    • 限制条件
    • 样例输入1
    • 样例输出1
    • 样例输入2
    • 样例输出2
    • 样例输入3
    • 样例输出3
  • 求解
    • 分析
    • 设计
    • 编码
    • 结果
    • 总结

题目

传送门: ALDS1_14_B: String Search

描述

寻找字符串P在一个文本T中出现的位置, 输出所有在T中找到的P的索引, T的索引从0开始.

输入

第一行, 给出一个文本T, 在第二行, 给出一个字符串P

输出

每行输出一个在T中找到的P的下标, 以升序输出

限制条件

  • \(1 \leq length of T \leq 1000000\)
  • \(1 \leq length of P \leq 10000\)
  • 输入由字母字符和数字组成

样例输入1

aabaaa
aa

样例输出1

0
3
4

样例输入2

xyzz
yz

样例输出2

1

样例输入3

abc
xyz

样例输出3

 

求解

分析

尝试了普通的查找, 从T开始遍历, 如果第一次匹配了, 然后将当前位置给k, 然后k遍历T, j遍历P, 如果有不同则退出, 如果全部相同则输出, 之后继续之前T的遍历
但是结果是时间超时, 完全没有更好的思路, 只能查看别人的代码
tk4114的代码
根据他的思路, 只需要用i遍历一遍T就行, 中间不需要在匹配或者不匹配时往回退一段.
根据待查找的字符串, 可能会存在一部分重复的情况, 比如说: P = aaab, 在T = aaaab中查找时, i遍历T, j遍历P, 前3个a匹配完毕, 到了第四个a的时候, 前面是b, 所以不能匹配, 但是由于之前有3个a已经匹配过了, 我们不需要将i退回到第2个a的位置, 并将j退回到第一个a的位置, 而只需要将j退回到第3个a的位置, 然后重新进行比较就可以了, 相当于在P中前两个a已经比较过了. 从而减少比较的次数

设计

还是感觉有点不理解, 直接贴代码了

编码

// 参考了用户 tk4114 的代码
#include <bits/stdc++.h>
using namespace std;int main(void) {ios::sync_with_stdio(false);cin.tie(0);char T[1000005], P[10005];cin.getline(T, 1000005);int Tl = cin.gcount() - 1;cin.getline(P, 10005);int Pl = cin.gcount() - 1;if (Pl > Tl) return 0;int jmp[10005];jmp[1] = 0;int i = 2, j = 0;while (i <= Pl) {if (P[i - 1] == P[j]) {i++;j++;jmp[i - 1] = j;} else if (j > 0) {j = jmp[j];} else {jmp[i] = 0;i++;}}i = 0;j = 0;while (i < Tl) {if (T[i] == P[j]) {i++;j++;if (j == Pl) {cout << i - Pl << endl;j = jmp[j];}} else if (j > 0) {j = jmp[j];} else {i++;}}
}

结果

由于是几乎照搬别人的代码, 就不截图了

总结

可能几天内暂时不做其他题了, 专心研究这一块

转载于:https://www.cnblogs.com/by-sknight/p/10944961.html

[Aizu] ALDS1_14_B: String Search相关推荐

  1. ES的多种搜索机制:query string search,query DSL,query filter,full-text search,phrase search,highlight search

    1.query string search 搜索全部商品: GET /ecommerce/product/_search took:耗费了几毫秒 timed_out:是否超时,这里是没有 _shard ...

  2. JavaScript的string.search()方法怎么用?

    string.search()是JavaScript中的一个内置方法,用于搜索正则表达式和给定字符串对象之间的匹配.下面本篇文章就来给大家介绍一下string.search()方法,希望对大家有所帮助 ...

  3. php redis search,php redis类

    php redis类 class phpredis extends Redis{ /* 构造函数:实例化redis类 @param config redis配置,格式: array( 'host' = ...

  4. Elasticsearch之search搜索入门

    1. 搜索语法入门 1.1query string search 无条件搜索所有 GET /book/_search {"took" : 969,"timed_out&q ...

  5. JavaScript中带示例的字符串search()方法

    字符串search()方法 (String search() Method) search() is method is a String method, it is used to check wh ...

  6. string数据库使用和实践第一部分string数据库介绍

    背景 为什么要寻找蛋白质互做关系? 因为只有正确地发现和注释细胞中的所有功能性的相互作用关系,才能对细胞的功能进行系统层面的学习和理解. 大家在收集和展现蛋白质相互作用的信息上,一直在努力地跟上相互作 ...

  7. 2-14 微信小程序string数据类型(附带方法解析)

    数据类型 WXS 语言目前共有以下几种数据类型: number : 数值 string :字符串 boolean:布尔值 object:对象 function:函数 array : 数组 date:日 ...

  8. horspool 算法java实现_关于String里indexOf()的一些思考

    评论 # re: 关于String里indexOf()的一些思考 2010-09-30 11:36 denniis 理论上说简单的匹配算法是O(m*n)的时间复杂度,而KMP可以达到O(m+n),在我 ...

  9. ABAP 字符串处理 CONCATENATE SPLIT STRLEN CONDENSE SEARCH OVERLAY

    CONCATENATE连接字符串 CONCATENATE会去除字符串后面的空格 CONCATENATE str1 str2 INTO str SEPARATED BY ' '. 两个拼接字符会以空格分 ...

最新文章

  1. python入门简介
  2. A star算法优化二
  3. Python实现桶排序
  4. 同样是点工,凭什么他拿月薪20k,你却只有10k?
  5. Python安装xlrd和xlwt的步骤以及使用报错的解决方法
  6. Tricks (四十一)—— 一 list 两用
  7. 剑指offer 29 多于一半的数
  8. 2022-2028全球婚恋交友软件行业调研及趋势分析报告
  9. 利用Eigen库实现最小二乘拟合平面
  10. 安卓内存数据分析和内存脚本分析教程分享
  11. 1.1.1 操作系统的层次结构、基本概念、功能和目标
  12. 云服务器构建微信公众号管理系统
  13. 小白菜病害检测图像数据集介绍
  14. postgresql tips
  15. 猿团YTFramework UI框架正式发布 提高开发效率
  16. HttpClient 模拟登录手机版新浪微博
  17. 在手机上学习编程?这4个软件让你轻松搞定!
  18. java 链表 深拷贝_单链表深拷贝的实现
  19. iOS CAReplicatorLayer 复制图层
  20. 跟Steve Jobs学简报,全1-5

热门文章

  1. Premiere学习笔记
  2. 手把手用Python教你如何发现隐藏wifi
  3. CSS学习笔记之选择器(一)
  4. UNIX系统中进程由哪三部分组成
  5. 大写汉字转阿拉伯数字c语言,C# 将阿拉伯数字转换为大写中文的代码
  6. H5 + vue 监听手机屏幕旋转及判断横竖屏
  7. 网站服务器崩溃原因,云服务器网站崩溃的原因
  8. 令你有所触动的经典语录
  9. trunc函数的用法
  10. [世界杯] 阿根廷 vs 塞黑 破本次比赛的最高得分悬殊 6-0