题目描述:
给你一个下标从 0 开始的字符串 s
、字符串 a
、字符串 b
和一个整数 k
。
如果下标 i
满足以下条件,则认为它是一个 美丽下标:
0 <= i <= s.length - a.length
s[i..(i + a.length - 1)] == a
- 存在下标
j
使得:0 <= j <= s.length - b.length
s[j..(j + b.length - 1)] == b
|j - i| <= k
以数组形式按 从小到大排序 返回美丽下标。
示例 1:
输入:s = "isawsquirrelnearmysquirrelhouseohmy", a = "my", b = "squirrel", k = 15 输出:[16,33] 解释:存在 2 个美丽下标:[16,33]。 - 下标 16 是美丽下标,因为 s[16..17] == "my" ,且存在下标 4 ,满足 s[4..11] == "squirrel" 且 |16 - 4| <= 15 。 - 下标 33 是美丽下标,因为 s[33..34] == "my" ,且存在下标 18 ,满足 s[18..25] == "squirrel" 且 |33 - 18| <= 15 。 因此返回 [16,33] 作为结果。
示例 2:
输入:s = "abcd", a = "a", b = "a", k = 4 输出:[0] 解释:存在 1 个美丽下标:[0]。 - 下标 0 是美丽下标,因为 s[0..0] == "a" ,且存在下标 0 ,满足 s[0..0] == "a" 且 |0 - 0| <= 4 。 因此返回 [0] 作为结果。
提示:
1 <= k <= s.length <= 105
1 <= a.length, b.length <= 10
s
、a
、和b
只包含小写英文字母。
通过代码:
class Solution {
public List<Integer> beautifulIndices(String s, String a, String b, int k) {
boolean tag = true;
List<Integer> list = new ArrayList<>();
for (int i = 0; i <= (s.length() - a.length()); ++i){
tag = true;
if (s.substring(i, (i + a.length())).equals(a)){
for (int j = ((i - k)>0?(i-k):0); (j <= (s.length() - b.length())) && tag; ++j){
if (s.substring(j, (j + b.length())).equals(b)){
if( ( (i-j>0) ? (i-j):(j-i) ) <= k ){
list.add(i);
tag = false;
}
}
}
}
}
return list;
}
}
算法解析:
算法基本按照题目中所述的美丽下标的定义进行编写。
在编写算法的过程中,为了优化执行的速度,减少不必要的循环条件,引入了一个布尔变量tag,每当我们发现其为一个美丽下标的时候,我们将tag变为false,使其跳出内层循环,减少不必要的搜寻。
同时,在编写代码时,我们引入了三元表达式,实现了诸如绝对值等方法。
int j = ((i - k)>0?(i-k):0) //避免了出现下标小于0的情况,并缩小了遍历范围
(i-j>0) ? (i-j):(j-i) // 三元表达式求解 |i-j|
复杂度分析:
时间复杂度:,其中
和
分别为字符串
s
和字符串 a
的长度;
空间复杂度:常数级。