当前位置: 面试刷题>> 模式识别 (经典算法题500道)


题目描述补充

题目:模式识别 - 字符串中的子模式计数

在给定的一个长字符串中,我们需要识别并计算一个特定子模式(子字符串)出现的次数。子模式可以是一个固定的字符串,也可以是遵循某种规则(如正则表达式)的字符串模式。要求实现一个函数,该函数接收两个参数:一个长字符串(s)和一个子模式(pattern),并返回子模式在长字符串中出现的次数(不重叠)。

示例

示例 1:

  • 输入: s = "abcabcabc", pattern = "abc"
  • 输出: 3
  • 解释: "abc""abcabcabc" 中出现了三次。

示例 2:

  • 输入: s = "abababab", pattern = "abab"
  • 输出: 2
  • 解释: "abab""abababab" 中出现了两次,分别是 "abababab" 的前两个字符和后两个字符。

示例 3(正则表达式):

  • 输入: s = "123abc123def123", pattern = "\\d+"(正则表达式匹配一个或多个数字)
  • 输出: 2
  • 解释: "123" 出现了两次,分别在 "123abc123def123" 的开始和中间部分。

PHP 示例代码

function countPatternOccurrences($s, $pattern) {
    // 如果pattern是正则表达式
    if (preg_match('/^\/.+\/$/', $pattern)) {
        // 去除正则表达式的斜杠
        $pattern = trim($pattern, '/');
        $count = preg_match_all("/$pattern/", $s, $matches);
    } else {
        $count = substr_count($s, $pattern);
    }
    return $count;
}

// 示例调用
echo countPatternOccurrences("abcabcabc", "abc"); // 输出: 3
echo countPatternOccurrences("abababab", "abab"); // 输出: 2
echo countPatternOccurrences("123abc123def123", "/\\d+/"); // 输出: 2

Python 示例代码

import re

def count_pattern_occurrences(s, pattern):
    if pattern.startswith('/') and pattern.endswith('/'):
        # 处理正则表达式
        pattern = pattern[1:-1]
        count = len(re.findall(pattern, s))
    else:
        count = s.count(pattern)
    return count

# 示例调用
print(count_pattern_occurrences("abcabcabc", "abc"))  # 输出: 3
print(count_pattern_occurrences("abababab", "abab"))  # 输出: 2
print(count_pattern_occurrences("123abc123def123", "/\\d+/"))  # 输出: 2

JavaScript 示例代码

function countPatternOccurrences(s, pattern) {
    if (pattern.startsWith('/') && pattern.endsWith('/')) {
        // 处理正则表达式
        const regex = new RegExp(pattern.slice(1, -1), 'g');
        const matches = s.match(regex) || [];
        return matches.length;
    } else {
        return (s.match(new RegExp(pattern, 'g')) || []).length;
    }
}

// 示例调用
console.log(countPatternOccurrences("abcabcabc", "abc")); // 输出: 3
console.log(countPatternOccurrences("abababab", "abab")); // 输出: 2
console.log(countPatternOccurrences("123abc123def123", "/\\d+/")); // 注意:JavaScript中不直接支持正则表达式的这种写法,需要调整输入
// 对于正则表达式,直接传入不含斜杠的字符串即可
console.log(countPatternOccurrences("123abc123def123", "\\d+")); // 输出: 2

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法详解、面试技巧、实战项目等,帮助大家提升编程能力和职业素养。

推荐面试题