当前位置: 面试刷题>> 模式识别 (经典算法题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 示例代码
```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 示例代码
```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 示例代码
```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
```
**码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法详解、面试技巧、实战项目等,帮助大家提升编程能力和职业素养。