返回 课程
信奥AC之路-3级
0% 完成
0/0 步骤
-
第一课:数组基础4 主题|小节
-
第二课:数组基础二6 主题|小节
-
第三课:数组基础三6 主题|小节
-
第四课:数组基础四7 主题|小节
-
第五课:数组基础五5 主题|小节
-
第六课:数组用于统计,去重,排序5 主题|小节
-
第七课:冒泡排序6 主题|小节
-
第八课:数组连续性元素6 主题|小节
-
第九课:数组综合一7 主题|小节
-
第十课:字符数组7 主题|小节
-
第十一课:字符数组基础应用5 主题|小节
-
第十二课:字符数组基础应用二6 主题|小节
-
第十三课:字符数组进阶6 主题|小节
-
第十四课:字符串进阶二6 主题|小节
-
第十五课:字符串(STL)9 主题|小节
-
第十六课:字符串基础6 主题|小节
-
第十七课:字符串函数6 主题|小节
-
第十八课:字符串函数二4 主题|小节
-
第十九课:sort函数7 主题|小节
-
第二十课:字符串进阶7 主题|小节
-
第二十一课:字符串进阶二6 主题|小节
-
第二十二课:进制转换--十进制转其他进制5 主题|小节
-
第二十三课:进制转换--其他进制转十进制5 主题|小节
-
第二十四课:二进制,八进制,十六进制转换5 主题|小节
-
第二十五课:数据编码基础6 主题|小节
-
第二十六课:位运算基础6 主题|小节
课 进展
0% 完成
“现在让我们把学到的知识结合起来,解决更复杂的问题,”我鼓励道。
17.5.1 手动实现字符串查找
题目描述: 不使用find函数,手动实现在父字符串中查找子字符串的所有出现位置。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s, t;
getline(cin, t); // 读取子字符串
getline(cin, s); // 读取父字符串
bool found = false; // 标记是否找到匹配
// 遍历父字符串的每个可能起始位置
for(int i = 0; i <= s.size() - t.size(); i++){
// 从位置i截取与子字符串等长的部分
string w = s.substr(i, t.size());
if(t == w){ // 如果匹配
cout << i << endl; // 输出位置(从0开始)
found = true;
}
}
if(!found){ // 如果没找到任何匹配
cout << -1 << endl;
}
return 0;
}
17.5.2 忽略大小写的手动查找
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s, t;
int first_pos = -1, last_pos = -1; // 首次和最后位置
cin >> s >> t;
// 转换为大写进行比较
for(int i = 0; i < s.size(); i++)
s[i] = toupper(s[i]); // 转换为大写字母
for(int i = 0; i < t.size(); i++)
t[i] = toupper(t[i]); // 转换为大写字母
// 遍历查找所有匹配位置
for(int i = 0; i <= s.size() - t.size(); i++){
string w = s.substr(i, t.size()); // 截取子串
if(w == t){ // 如果匹配
if(first_pos == -1) // 记录首次位置
first_pos = i;
last_pos = i; // 更新最后位置
}
}
cout << first_pos + 1 << " " << last_pos + 1 << endl; // 输出位置
return 0;
}
算法解析:
- 手动实现通过逐一比较子串来查找匹配
- 使用substr函数截取等长子串进行比较
- 注意循环边界:
i <= s.size() - t.size()
- 通过转换大小写实现不敏感比较
- 维护首次和最后位置变量