1876. 长度为三且各字符不同的子字符串

138 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

题目 leetcode.cn/

  • 如果一个字符串不含有任何重复字符,我们称这个字符串为  字符串。
  • 给你一个字符串 s ,请你返回 s 中长度为 3 的 好子字符串 的数量。
  • 注意,如果相同的好子字符串出现多次,每一次都应该被记入答案之中。
  • 子字符串 是一个字符串中连续的字符序列。

示例

  • 示例 1:

    • 输入: s = "xyzzaz"
    • 输出: 1
    • 解释: 总共有 4 个长度为 3 的子字符串:"xyz","yzz","zza" 和 "zaz" 。
    • 唯一的长度为 3 的好子字符串是 "xyz" 。
  • 示例 2:

    • 输入: s = "aababcabc"
    • 输出: 4
    • 解释: 总共有 7 个长度为 3 的子字符串:"aab","aba","bab","abc","bca","cab" 和 "abc" 。
    • 好子字符串包括 "abc","bca","cab" 和 "abc" 。

提示

  • 1 <= s.length <= 100
  • s只包含小写英文字母。

代码

function countGoodSubstrings(s: string): number {
    if(s.length < 3) return 0;
    let count = 0;
    for(let k = 0; k < s.length - 2; k++){
        if(s[k] !== s[k+1] && s[k+1] !== s[k+2] && s[k] !== s[k+2]){
            count++;
        }
    }
    return count;
};
  • 暴力解法:
    • 首先排除字符串长度小于3的字符串,一定是不包括符合要求的好子字符串
    • 然后定义一个统计符合要求的计数器变量。遍历整个字符串,将字符串的每个字符依次取出,每次比较当前项和后两项的单个字符,看是否存在相同的英文字符。如果不存在,则统计为一个符合要求的子字符串。最后返回统计完的结果
    • 时间复杂度:O(n),其中 ns 的长度。我们遍历了一遍字符串,对于每个下标为 i 且长度为 3 的子字符串,判断其是不是好子字符串的时间复杂度为 O(1)
    • 空间复杂度:O(1)