zoukankan      html  css  js  c++  java
  • 21 字符串专题:第一个只出现一次的字符

    0 引言

    本专题专门针对字符串处理问题,解答了一系列问题。用到了C++中的string类,下面将对string类的方法进行介绍。

    #include <string>   // 头文件

    using std::string; 

    (1)利用迭代器对字符串元素进行访问

    void visitCharInString(string str){
      for(std::string::iterator it = str.begin(); it != str.end(); ++ it){
          cout << *it << "	";    
      }  
    }

    (2)访问字符串中的元素

      1. 操作符operator[]

      for (int i=0; i<str.length(); ++i)
      {
        std::cout << str[i];
      }

      2. at方法

      for (unsigned i=0; i<str.length(); ++i)
      {
        std::cout << str.at(i);
      }

      3. back方法访问字符串的最后一个字符

      std::string str ("hello world.");
      str.back() = '!';
      std::cout << str << '
    ';

      4. front方法访问字符串的第一个字符

      std::string str ("test string");
      str.front() = 'T';
      std::cout << str << '
    ';

    (3)字符串问题之第一个只出现一次的字符

    题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

    1 抽象问题具体化

    举例:返回字符串 “google”中第一个只出现一次的字符,如果没有则返回-1.

    解答:1. 遍历字符串,访问g,++ myStr['g' - 'A'] ,保存第一个g出现的位置, position['g' - 'A'];

       2. 继续访问其他字符, ++ myStr[str[i] - 'A'],保存第一个str[i]出现的位置, position[str[i] - 'A']; 

       3. 遍历myStr和position,找到mystr[i] == 1的最小的position的值,即为google中第一个只出现一次的字符,为 'l' .

    2 具体问题抽象分析

    (1)定义两个整型数组, myStr, positon, 并resize 为 size = 'z' - 'A' + 1 这么大

    (2)遍历字符串,保存每个字符出现的次数至myStr, 保存每个字符初次出现的位置到 position

    (3)遍历myStr 和position,寻找myStr[i] == 1 的位置最靠前的字符,即position[i]最小 , 保存在firstOnlyPosition中

    (4)如果firstOnlyPosition == 初始值,则返回-1;否则,返回firstOnlyPosition作为结果输出.

    3 demo

    /* FirstNotRepeatingChar: 寻找字符串中第一个不重复出现的字符
    * 输入参数:字符串
    * 输出参数:该字符在字符串中的位置
    * 采用的算法核心思想: 两次遍历找到结果
        1. 第一次遍历字符串时,保存每个相同字符出现的次数和首次出现的位置;
        2. 第二次遍历字符串时,寻找只出现过一次的字符中,出现位置最早的字符,返回结果即可
    * 算法的复杂度:O(n + k),k为不重复字符出现的次数
    */
    int
    FirstNotRepeatingChar(string str) { vector<int> myStr, position; const int size = 'z' - 'A' + 1; myStr.resize(size), position.resize(size); for(int i=0; i<str.size(); i++){ ++ myStr[str[i]-'A']; if(myStr[str[i]-'A'] == 1) position[str[i]-'A'] = i; } int firstOnlyPosition = str.size(); for(int i=0;i<size;i++){ if(myStr[i] == 1 && position[i] < firstOnlyPosition) firstOnlyPosition = position[i]; } if(firstOnlyPosition == str.size()) return -1; else return firstOnlyPosition; }

    4 代码优化

    暂时还没有找到更好的算法,以后再说吧

        

  • 相关阅读:
    BUAA 2020 软件工程 个人项目作业
    BUAA 2020 软件工程 个人博客作业
    BUAA 2020 软件工程 热身作业
    面向对象设计与构造2019 第四单元总结博客作业
    面向对象设计与构造2019 第三单元总结博客作业
    Windows 安装rabbitmq
    windows 安装mongodb4.2.7
    docker安装(ubuntu20.04)
    C# 文件操作
    经纬度转换 sql 自定义函数
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10132219.html
Copyright © 2011-2022 走看看