牛客题解 | 字符串匹配
1.牛客题解 | 几个岛2.牛客题解 | 分割后处理3.牛客题解 | 分布式集群消息传递4.牛客题解 | 分玩具5.牛客题解 | 分田地6.牛客题解 | 分石头7.牛客题解 | 分苹果8.牛客题解 | 分贝壳9.牛客题解 | 列表补全10.牛客题解 | 删数11.牛客题解 | 删除公共字符12.牛客题解 | 删除重复字符13.牛客题解 | 删除重复字符_114.牛客题解 | 判断一棵满二叉树是否为二叉搜索树15.牛客题解 | 判断题16.牛客题解 | 包裹运输17.牛客题解 | 区间表达18.牛客题解 | 升级蓄水池19.牛客题解 | 单词缩写20.牛客题解 | 卡中心密码安全规范21.牛客题解 | 卡中心美食家22.牛客题解 | 厨艺大赛奖金23.牛客题解 | 友好城市24.牛客题解 | 双素数25.牛客题解 | 双色塔26.牛客题解 | 双袋购物27.牛客题解 | 发奖金28.牛客题解 | 古巴比伦迷宫29.牛客题解 | 句子反转30.牛客题解 | 吃鱼31.牛客题解 | 合唱团32.牛客题解 | 合并区间33.牛客题解 | 合并果子34.牛客题解 | 商品交易35.牛客题解 | 回合制游戏36.牛客题解 | 回文37.牛客题解 | 回文串38.牛客题解 | 回文序列39.牛客题解 | 回文数索引40.牛客题解 | 回文数组41.牛客题解 | 回文素数42.牛客题解 | 图的遍历43.牛客题解 | 图的闭包44.牛客题解 | 地下迷宫45.牛客题解 | 地牢逃脱46.牛客题解 | 地鼠逃跑计划47.牛客题解 | 堆棋子48.牛客题解 | 堆棋子_149.牛客题解 | 塔50.牛客题解 | 外卖满减51.牛客题解 | 多数组中位数52.牛客题解 | 多数组第 K 小数53.牛客题解 | 大家来扫雷54.牛客题解 | 大巴车(数组分块,按块翻转,块内不变)55.牛客题解 | 大数乘法56.牛客题解 | 大整数相乘57.牛客题解 | 头条校招58.牛客题解 | 奇数位丢弃59.牛客题解 | 奖学金60.牛客题解 | 奶牛编号61.牛客题解 | 好奇的薯队长62.牛客题解 | 如何添加运算符63.牛客题解 | 字母交换64.牛客题解 | 字母卡片65.牛客题解 | 字母数字混合排序66.牛客题解 | 字符串中找出连续最长的数字串67.牛客题解 | 字符串交错组成68.牛客题解 | 字符串价值69.牛客题解 | 字符串分割
70.牛客题解 | 字符串匹配
71.牛客题解 | 字符串压缩算法72.牛客题解 | 字符串复制73.牛客题解 | 字符串提取74.牛客题解 | 字符串旋转75.牛客题解 | 字符串是否由子串拼接76.牛客题解 | 字符串替换77.牛客题解 | 字符串替换_178.牛客题解 | 字符串最小变换次数79.牛客题解 | 字符串的排列80.牛客题解 | 字符串的旋转81.牛客题解 | 字符串相乘82.牛客题解 | 字符串组合83.牛客题解 | 字符串计数84.牛客题解 | 字符串距离85.牛客题解 | 字符串连连看86.牛客题解 | 字符串通配87.牛客题解 | 字符串问题88.牛客题解 | 字符混编89.牛客题解 | 字符编码90.牛客题解 | 字符覆盖91.牛客题解 | 字符迷阵92.牛客题解 | 字符迷阵_193.牛客题解 | 字符集合94.牛客题解 | 孙悟空的徒弟95.牛客题解 | 学数学96.牛客题解 | 安置路灯97.牛客题解 | 完成括号匹配98.牛客题解 | 实现字通配符*99.牛客题解 | 密码检查100.牛客题解 | 密码破译题目
解题思路
使用正则表达式解决匹配问题:
- 将B串中的'?'转换为正则表达式[01]
- 使用HashSet去重存储匹配的子串
- 统计不同匹配的数量
关键点
- 正则表达式构建
- 子串匹配
- 使用Set去重
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(string& A, string& B) {
// 构建正则表达式模式
string pattern;
for (char c : B) {
if (c == '?') {
pattern += "[01]";
} else {
pattern += c;
}
}
// 存储所有可能的匹配结果
unordered_set<string> st;
// 遍历所有可能的子串
for (int i = 0; i <= A.length() - B.length(); i++) {
string sub = A.substr(i, B.length());
bool match = true;
// 手动匹配模式
for (int j = 0; j < B.length(); j++) {
if (B[j] == '?' || B[j] == sub[j]) continue;
match = false;
break;
}
if (match) st.insert(sub);
}
return st.size();
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string A, B;
getline(cin, A);
getline(cin, B);
Solution sol;
cout << sol.solve(A, B) << endl;
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public int solve(String A, String B) {
// 存储所有可能的匹配结果
Set<String> st = new HashSet<>();
// 遍历所有可能的子串
for (int i = 0; i <= A.length() - B.length(); i++) {
String sub = A.substring(i, i + B.length());
boolean match = true;
// 手动匹配模式
for (int j = 0; j < B.length(); j++) {
if (B.charAt(j) == '?' || B.charAt(j) == sub.charAt(j)) continue;
match = false;
break;
}
if (match) st.add(sub);
}
return st.size();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String A = sc.nextLine();
String B = sc.nextLine();
Solution sol = new Solution();
System.out.println(sol.solve(A, B));
sc.close();
}
}
class Solution:
def solve(self, A: str, B: str) -> int:
# 存储所有可能的匹配结果
st = set()
# 遍历所有可能的子串
for i in range(len(A) - len(B) + 1):
sub = A[i:i + len(B)]
match = True
# 手动匹配模式
for j in range(len(B)):
if B[j] == '?' or B[j] == sub[j]:
continue
match = False
break
if match:
st.add(sub)
return len(st)
def main():
A = input().strip()
B = input().strip()
sol = Solution()
print(sol.solve(A, B))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串匹配 + 集合去重
- 时间复杂度:, 为 长度, 为 长度
- 空间复杂度:, 为不同匹配的子串数量
合集:
牛客笔试大厂真题题解2
分类:
牛客笔试大厂真题题解2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)