题目描述补充
题目:模式识别 - 字符串中的子模式计数
在给定的一个长字符串中,我们需要识别并计算一个特定子模式(子字符串)出现的次数。子模式可以是一个固定的字符串,也可以是遵循某种规则(如正则表达式)的字符串模式。要求实现一个函数,该函数接收两个参数:一个长字符串(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
码小课网站中有更多相关内容分享给大家学习,包括但不限于算法详解、面试技巧、实战项目等,帮助大家提升编程能力和职业素养。