Every day a Leetcode
题目来源:3006. 找出数组中的美丽下标 I
解法1:暴力
用 C++ 标准库中的字符串查找函数,找到 a 和 b 分别在 s 中的起始下标,将符合要求的下标插入答案。
代码:
/*
* @lc app=leetcode.cn id=3006 lang=cpp
*
* [3006] 找出数组中的美丽下标 I
*/
// @lc code=start
class Solution
{
public:
vector<int> beautifulIndices(string s, string a, string b, int k)
{
// 特判
if (s.empty() || a.empty() || b.empty() || k <= 0 || k > s.size())
return {};
if (s.length() < a.length() || s.length() < b.length())
return {};
int slen = s.size(), alen = a.size(), blen = b.size();
vector<int> indices;
int pos_a = s.find(a, 0), pos_b = s.find(b, 0);
while (pos_a != string::npos && pos_b != string::npos)
{
while (pos_b != string::npos && pos_a - pos_b > k)
pos_b = s.find(b, pos_b + 1);
if (pos_b != string::npos && abs(pos_a - pos_b) <= k)
indices.push_back(pos_a);
pos_a = s.find(a, pos_a + 1);
}
return indices;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(slen * alen * blen),其中 slen 是字符串 s 的长度,alen 是字符串 a 的长度,blen 是字符串 b 的长度。
空间复杂度:O(1)。
解法2:暴力
暴力匹配,但是注意减小 j 的取值范围,并且取到答案后立即 break,否则会有重复。
代码:
/*
* @lc app=leetcode.cn id=3006 lang=cpp
*
* [3006] 找出数组中的美丽下标 I
*/
// @lc code=start
class Solution
{
public:
vector<int> beautifulIndices(string s, string a, string b, int k)
{
// 特判
if (s.empty() || a.empty() || b.empty() || k <= 0 || k > s.size())
return {};
if (s.length() < a.length() || s.length() < b.length())
return {};
int slen = s.size(), alen = a.size(), blen = b.size();
vector<int> indices;
for (int i = 0; i <= slen - alen; i++)
{
if (s.substr(i, alen) == a)
{
// 注意减小 j 的取值范围
int start = max(0, i - k), end = min(slen, i + k);
for (int j = start; j <= end; j++)
if (s.substr(j, blen) == b)
{
indices.push_back(i);
break;
}
}
}
return indices;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(slen * alen * blen),其中 slen 是字符串 s 的长度,alen 是字符串 a 的长度,blen 是字符串 b 的长度。
空间复杂度:O(1)。