C/C++ 字符串专题

字符串专题

2878.字串排序

在 2010 年百度公司的一次校园招聘笔试中,要求应聘者设计一个 strnumcmp 函数。对比普通的 strcmp 函数,差别在于,当字符串中包含数字时,比较数字大小。数字大小相同或不含数字时,仍然沿用原来的 strcmp 方式。所有不含数字的字符串均小于含数字的字符串。每个字符串的长度范围为 1 ~ 30,而其中包含的数字个数范围为 0 ~ 8,且数字在一个字符串中是连续的。

例如:strnumcmp 的判定结果:

“abc”<“abc#”<“abcd”<“abc1”<“abc2”<“abc10”

而一般的 strcmp 的判定结果:

“abc”<“abc#”<“abc1”<“abc10”<“abc2”<“abcd”

写一个程序,用 strnumcmp 函数对一组字符串按升序排序。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int getNum(string s)
{
   
    int len = s.length();
    int flag = 0, sum = 0;
    for (int i = 0; i < len; i++)
    {
   
        if (s[i] >= '0' && s[i] <= '9')
        {
   
            sum = 10 * sum + s[i] - '0';
            flag = 1;//has a number
        }
    }
    if (flag == 0) sum = -1;//has no number
    return sum;
}

bool strnumcmp(string a, string b)
{
   
    int num1 = getNum(a), num2 = getNum(b);
    if (num1 == num2) return a < b;
    else
    {
   
        if (num1 < num2) return true;
        else return false;
    }
}

int main()
{
   
    string s[120];
    int cnt = 0;
    while (cin >> s[cnt])
    {
   
        cnt++;
        //getchar();
    }
    sort(s, s + cnt, strnumcmp);
    //cout << cnt << endl;
    for (int i = 0; i < cnt-1; i++)
        cout << s[i] << " ";
    cout << s[cnt - 1] << endl;
    
}

3194.字符串消除

给定一个由大写字母A、B、C构成的字符串s,按如下进行消除过程:

1、字符串s中连续相同字母组成的子串,如果子串的长度大于1,那么这些子串会被同时消除,余下的字符拼成新的字符串。

例如:ABCCBCCCAA中CC,CCC和AA会被同时消除,余下AB和B拼成新的字符串ABB。

2、反复进行上述消除,直到新的字符串中相邻字符都不相同为止。

例如:ABCCBCCCAA经过一轮消除得到ABB,再经过一轮消除得到A。

假设在对字符串s消除开始前,允许在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符(A,B或者C),得到字符串t,然后对字符串t经过一系列消除。

请问该如何插入字符,使得字符串t中被消除掉的字符总数(包括插入的字符)最多?

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int del(string &s)
{
   
    int x = 0;//消除字符个数
    int flag = 0;
    for (int i = 0; s.length() > 0 && i < s.length() - 1; i++)
    {
   
        if (s[i] == s[i + 1])
        {
   
            x++;
            int y = 1;
            for (int j = i; j < s.length() - 1; j++)
                if (s[j] == s[j + 1]) x++, y++;
                else break;
            s.erase(i, y);
            flag = 1;
            i--;
        }
    }
    if (flag == 1) return x + del(s);
    else return x;
}

int max(int a, int b)
{
   
    if (a > b) return a;
    return b;
}

int main()
{
   
    int t; cin >> t;
    for (int m = 0; m < t; m++)
    {
   
        string x[3] = {
    "A","B","C" };
        string s; cin >> s;
        int len = s.length();
        int ans = 0;
        for (int i = 0; i < len; i++)
        {
   
            for (int j = 0; j < 3; j++)
            {
   
                string temp(s); temp.insert(i, x[j]);
                ans = max(ans, del(temp));
            }
        }
        cout << "case #" << m << ":\n" << ans << endl;
    }
}

3023.字符组合

输入一个由字母组成的字符串S,长度[1,16],按字典序输出由 中不同字符组成的所有字符组合(每个组合中的字符也按字典序排列)。

例如:cbaabc 中的不同字符是 a、b、c 共 3 个,则 1 个字符组成的组合是 a、b、c3 种,2 个字符组成的组合是 ab、bc、ac3 种,3 个字符组成的组合是 abc1 种。注意:ab 和 ba 由相同字符组合而成,因此可认为是同一个组合。那么这个例子共有 7 种组合,按序分别为 a、ab、abc、ac、b、bc、c。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

int main()
{
   
    int t; cin >> t;
    for (int I = 0; I < t; I++)
    {
   
        vector<char> str;
        vector<string>out;
        string s; cin >> s;
        //去重
        for (int i = 0; i < s.length(); i
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值