[CTCI] 子串判断

本文介绍了一种高效的子串判断算法,通过使用后缀数组和二分查找技术,快速判断一组较短字符串是否为长字符串的子串。适用于字符串长度不超过1000,子串数量不超过500的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子串判断

题目描述

现有一个小写英文字母组成的字符串s和一个包含较短小写英文字符串的数组p,请设计一个高效算法,对于p中的每一个较短字符串,判断其是否为s的子串。

给定一个string数组p和它的大小n,同时给定string s,为母串,请返回一个bool数组,每个元素代表p中的对应字符串是否为s的子串。保证p中的串长度小于等于8,且p中的串的个数小于等于500,同时保证s的长度小于等于1000。

测试样例:
["a","b","c","d"],4,"abc"
返回:[true,true,true,false]


后缀数组?二分查找!

 1 class Substr {
 2 public:
 3     bool matched(string a, string b) {
 4         if (b.length() < a.length()) return false;
 5         for (int i = 0; i < a.length(); ++i) if (a[i] != b[i]) return false;
 6         return true;
 7     }
 8     vector<bool> chkSubStr(vector<string> p, int n, string s) {
 9         // write code here
10         set<string> st;
11         vector<bool> res;
12         for (int i = 0; i < s.length(); ++i) {
13             st.insert(s.substr(i));
14         }
15         for (int i = 0; i < n; ++i) {
16             auto it = st.lower_bound(p[i]);
17             if (it == st.end()) {
18                 res.push_back(false);
19             } else {
20                 if (matched(p[i], *it)) res.push_back(true);
21                 else res.push_back(false);
22             }
23         }
24         return res;
25     }
26 };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值