返回 课程

信奥AC之路-3级

0% 完成
0/0 步骤
  1. 第一课:数组基础
    4 主题|小节
  2. 第二课:数组基础二
    6 主题|小节
  3. 第三课:数组基础三
    6 主题|小节
  4. 第四课:数组基础四
    7 主题|小节
  5. 第五课:数组基础五
    5 主题|小节
  6. 第六课:数组用于统计,去重,排序
    5 主题|小节
  7. 第七课:冒泡排序
    6 主题|小节
  8. 第八课:数组连续性元素
    6 主题|小节
  9. 第九课:数组综合一
    7 主题|小节
  10. 第十课:字符数组
    7 主题|小节
  11. 第十一课:字符数组基础应用
    5 主题|小节
  12. 第十二课:字符数组基础应用二
    6 主题|小节
  13. 第十三课:字符数组进阶
    6 主题|小节
  14. 第十四课:字符串进阶二
    6 主题|小节
  15. 第十五课:字符串(STL)
    9 主题|小节
  16. 第十六课:字符串基础
    6 主题|小节
  17. 第十七课:字符串函数
    6 主题|小节
  18. 第十八课:字符串函数二
    4 主题|小节
  19. 第十九课:sort函数
    7 主题|小节
  20. 第二十课:字符串进阶
    7 主题|小节
  21. 第二十一课:字符串进阶二
    6 主题|小节
  22. 第二十二课:进制转换--十进制转其他进制
    5 主题|小节
  23. 第二十三课:进制转换--其他进制转十进制
    5 主题|小节
  24. 第二十四课:二进制,八进制,十六进制转换
    5 主题|小节
  25. 第二十五课:数据编码基础
    6 主题|小节
  26. 第二十六课:位运算基础
    6 主题|小节
课 17, 主题|小节 5
进行中

17.5 字符串函数综合应用

2025年9月22日
课 进展
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;
} 

算法解析

  1. 手动实现通过逐一比较子串来查找匹配
  2. 使用substr函数截取等长子串进行比较
  3. 注意循环边界:i <= s.size() - t.size()
  4. 通过转换大小写实现不敏感比较
  5. 维护首次和最后位置变量