华为机试-蛇形字符串

这篇博客介绍了如何解决华为机试中的一道题目,涉及寻找蛇形字符串的算法。蛇形字符串由连续的大小写字母对组成,且必须按照字母顺序排列。博客给出了示例输入和处理过程,以及解题思路,包括统计字母出现次数和寻找最大连续字符数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
输入一个字符串(不含空格), 请寻找输入中包含所有蛇形字符串。
蛇形字符串定义:

  • 1.蛇形字符串由连续字符对组成,其特点如下:
  • 1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小)。如:Aa,Dd;
  • 1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc或OoPpQqRrSs;
  • 2.从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
  • 2.1 每次寻找必须是最长的蛇形字符串;
  • 2.2 使用过的字符不能重复使用;

例: 输入SxxsrR^AaSs
正确处理过程:

  • Step1:SxxsrR^AaSs -> RrSs (找到两对连续字符对:Ss、Rr,可以组成蛇形字符串。另,Ss后应该是Tt,但当前字符串SxxsrR^AaSs中不包含,所以当前蛇形字符串到Ss结束。本轮查找结果是RrSs。)
  • Step2:xs^AaSs -> Aa
  • Step3:xx^Ss -> Ss

output:RrSs
              Aa
              Ss


输入描述:
一个字符串(不含空格,字符串长度<=5000)

输出描述:
所有包含的蛇形字符串,按蛇形字符串长短输出;同一个首字母的情况,按首字母升序排列(即A在Z前);如果没有找到,输出Not Found。

示例1:
输入:SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^^%%^UnbnvccTRChnyvcxcvVCFR
输出:
CcDdEeFf
CcDdEe
RrSs
VvWw
Ss


答题思路:

  1. 统计大写字母小写字母分别出现次数
  2. 统计一个字母大小写同时出现的次数,取最小次数保存,另一个丢弃(这里保存大写/小写均可,但如果保存大写就都大写)
  3. 寻找最大的连续字符数,输出。

参考代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    while(cin >> str)
    {
        int strs[26] = {0};
        int strl[26] = {0};
        for(int i = 0; i < str.size(); i++)         //统计字符
        {
            if(str[i] >= 'a' && str[i] <= 'z')
                strs[str[i] - 'a']++;
            else if(str[i] >= 'A' && str[i] <= 'Z')
                strl[str[i] - 'A']++;
        }
        
        vector<int> myvector(26);
        for(int i = 0; i < 26; i++)                //字符匹配
        {
            if(strs[i] && strl[i])
                strs[i] > strl[i] ? myvector[i] = strl[i] : myvector[i] = strs[i];
        }
        
        int flag = 0;      //标志最大字符串的起始位置
        int con = 0;       //连续字符个数
        int max = 0;       //标志最大连续字符是多少位  后面的数据 > max 才赋值
        if(count(myvector.begin(), myvector.end(), 0) == 26)
            cout << "Not Found" << endl;
        else
        {
            while(count(myvector.begin(), myvector.end(), 0) != 26)     //输出字符,直到 vector 全为零
            {
                for(int i = 0; i < 26; i++)
                {
                    if(myvector[i] != 0)           //统计连续字符数
                        con++;
                    else
                    {
                        if(con > max)
                        {
                            max = con;
                            flag = i - max;        //最大连续字符起始位置
                        }
                        con = 0;
                    }
                }
                
                //output
                for(int i = flag; i < flag + max; i++)
                {
                    char char1 = i + 'A';
                    char char2 = i + 'a';
                    cout << char1 << char2;
                    myvector[i]--;
                }
                cout << endl;
                flag = 0;
                max = 0;
            }
        }
    }
    return 0;
}

/*===============================================
 键盘输入:
 SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^^%%^UnbnvccTRChnyvcxcvVCFR
 函数输出:
 CcDdEeFf
 CcDdEe
 RrSs
 VvWw
 Ss
===============================================*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值