字符串算法总结

蓝桥杯字符串常用操作及算法总结


·getline()一次读取一行:当需要对字符串进行保存的时候,一般会建一个字符串用来保存。

vector<string> str;
string s;
getline(cin,s);
str.push_back(s);

这里也可以用set,set内部会默认进行排序

set<string> str;

·当想要遍历保存的字符串的时候,可以利用迭代器

vector<string>::const_iterator first;
first = str.begin();
for(;first!=str.end();first++)

·利用好C++中的algorithm.h
·将字符串中的字符全部转换为大写或小写

transform(a.begin(),a.end(),a.begin(),::toupper);//全部转换为大写
transform(a.begin(),a.end(),a.begin(),::tolower);//全部转化为小写

·回文问题的解决
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。

交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    int j = n-1;
    int cnt = 0;
    int flag = 0;
    for(int i=0;i<j;i++)
    {
        for(int k=j;k>=i;k--)
        {
            if(k==i)
            {
                if(n%2==0||flag==1)
                {
                    cout<<"Impossible";
                    return 0;
                }
                flag = 1;
                cnt += n/2-i;
            }
            else if(s[k]==s[i])
            {
                for(int l=k;l<j;l++)
                {
                    swap(s[l],s[l+1]);
                    cnt++;
                }
                j--;
                break;
            }
        }
    }
    cout<<cnt;
    return 0;
}

·字符串的插入、删除、替换操作
拿一个例题来看:
从键盘输入一个字符串(长度< =40个字符),并以字符’.’结束。编辑功能有:

  1. D:删除一个字符,命令的方式为:D a 其中a为被删除的字符,例如:D s 表示删除字符’s’,若字符串中有多个 ‘s’,则删除第一次出现的。
  2. I:插入一个字符,命令的格式为:I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符。例如:I s d 表示在指定字符 ’s’ 的前面插入字符 ‘d’ ,若原串中有多个 ‘s’,则插入在最后一个字符的前面。
  3. R:替换一个字符,命令格式为:R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则应全部替换。
    在编辑过程中,若出现被改的字符不存在时,则给出提示信息。

思路:
·用getline()来读取第一行字符串
·判断第二行第一个字符属于什么
·删除操作,利用find()函数找到后运用erase()
·插入操作,这里涉及到插入到最后一个之前,所以遍历目标字符串,取出最后一个的地址,使用insert()
·替换操作,同样是遍历,只要碰到便replace()

  #include <bits/stdc++.h>//万能头文件
  using namespace std;
  int main()
  {
      string s;
      string a,b,c;
      int i;
      getline(cin,s);//读取第一行
      cin>>a;
      int pos;
      int n;
      int m=0;
      if(a == "D")
      {
          cin>>b;
          if(s.find(b[0]) == s.npos)//判断是否找到
          {
              cout<<"404 not found"<<endl;
              //system("pause");
              return 0;
          }
          pos = s.find(b[0]);
          n = b.size();
          s = s.erase(pos,n);
      }
      else if(a == "I")
      {
          cin>>b;
          cin>>c;
          for(i=0;i<s.size();i++)//遍历字符串
          {
              if(s[i] == b[0])
              {
                  m = 1;
                  pos = i;
              }
          }
          if(m == 0)
          {
              cout<<"404 not found"<<endl;
              //system("pause");
              return 0;
          }
          s = s.insert(pos,c);
      }
      else if(a == "R")
      {
          cin>>b;
          cin>>c;
          for(i=0;i<s.size();i++)
          {
              if(s[i] == b[0])
              {
                  m=1;
                  pos = i;
                  s = s.replace(pos,1,c);
              }
          }
          if(m == 0)
          {
              cout<<"404 not found"<<endl;
              //system("pause");
              return 0;
          }
      }
      else
      {
          cout<<"Warning"<<endl;
          //system("pause");
          return 0;
      }
      cout<<s<<endl;
      //system("pause");
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值