博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Substring with Concatenation of All Words
阅读量:6258 次
发布时间:2019-06-22

本文共 2111 字,大约阅读时间需要 7 分钟。

题解


题目描述

Substring with Concatenation of All Words

即从字符串s中找出某个子串,此子串是长度一致的子串集合words的某种全排列,返回这些子串的开始位置。
如:s:"barfoofoobarthefoobarman",words:["bar","foo","the"];结果为[6,9,12]。

题解

假设原字符串s长度为n,words中元素长度为k,把k个字符当成一个整体来比较,即划分k趟进行遍历,再运用KMP思想进行匹配。时间复杂度约为O(k*n)。

此处注意的是容器的选择,基于二叉树的容器存取并不如基于哈希的容器存取快。以下代码采取了unordered_map作为容器记录前面的匹配情况。

代码

typedef std::string _Type;class Solution {public:    typedef std::unordered_map<_Type, int> UMAP;    std::vector
findSubstring(const std::string& s, std::vector
& words) { std::vector
vec; int wsize = words.size(), ssize = s.size(); if (wsize == 0 || ssize == 0) return vec; UMAP all; for (int i = 0; i < wsize; ++i) ++(all[words[i]]); for (int mod = 0, len = words[0].size(); mod < len; ++mod) { UMAP had; for (int j = mod, start = mod, end = ssize - wsize * len; j <= end; ) { std::string tmpStr(s.substr(j, len)); j += len; UMAP::iterator it(all.find(tmpStr)); if (it == all.end()) { had.clear(); start = j; end = ssize - wsize * len; } else { if (it->second > had[tmpStr]) { ++(had[tmpStr]); if (j - start == wsize * len) { --(had[s.substr(start, len)]); vec.push_back(start); start += len; } else { end += len; } } else { for (int k = start; ; k += len) { std::string stmp(s.substr(k, len)); if (stmp == tmpStr) { start = k + len; break; } --(had[stmp]); end -= len; } } } } } return vec; }};

总结

主要应用了KMP匹配的思想。

转载地址:http://pshsa.baihongyu.com/

你可能感兴趣的文章
jQuery webcam plugin调用摄像头
查看>>
Vue入门笔记
查看>>
bash脚本case与函数
查看>>
我的学习计划
查看>>
理解 Go 语言中的方法和接收者
查看>>
iView 发布 2.0.0-rc.16 版本
查看>>
React表单组件
查看>>
从0到1学习node(八)之异步控制工具async
查看>>
Android 运行时权限库
查看>>
网易漫画Swift混编实践
查看>>
如何针对业务设计架构?——QCon热点专题前瞻
查看>>
你的可用性达标了吗?云端业务性能高可用的深度实践
查看>>
Mozilla开发全新的公开网络API WebXR 来实现增强现实
查看>>
用户超5亿,三年投10亿,开发者如何抢滩支付宝小程序蓝海?
查看>>
[使用 Weex 和 Vue 开发原生应用] 2 编写独立页面
查看>>
Cosmos DB:全球分布式数据库
查看>>
Scrum联盟的新任全球营销副总裁访谈
查看>>
从把事做对到做对的事
查看>>
悟空:用Go语言编写的全文搜索引擎
查看>>
.NET 4.6的RyuJIT编译器中又发现两个严重的Bug
查看>>