华为OD机试统一考试D卷C卷 -求满足条件的最长子串的长度

 

 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:

1、 只包含1个字母(a~z, A~Z),其余必须是数字;

2、 字母可以在子串中的任意位置;

 

如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。

 

注:实际工作过程中,满足条件的字串可能会有多个,以下代码已经额外关注

#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <string>
using namespace std;

bool IsLetter(const char cTemp)
{
	if ((cTemp >= 'a' && cTemp <= 'z') || (cTemp >= 'A' && cTemp <= 'Z'))
	{
		return true;
	}
	return false;
}


bool IsNumber(const char cTemp)
{
	if ( (cTemp >= '0' && cTemp <= '9') )
	{
		return true;
	}
	return false;
}

class SubString
{
	int m_iLetter;
	int m_iNumber;
	string m_strSub;
public:
	SubString()
		:m_iNumber(0),m_iLetter(0)
	{

	}

unsigned int Getlength()
{
	return m_strSub.length();
}
string getStr()
{
	return m_strSub;
}
bool CheckSubStrFormat()
{
	if (m_iLetter == 1 && m_iNumber >= 1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

	bool PushBackLetter(const char cTemp)
	{
		char buffer[10];
		bool bCanPushBack(false);
		memset(buffer,0x00,10);
		sprintf(buffer,"%c",cTemp);
		if (IsLetter(cTemp) && m_iLetter == 0)
		{
			m_iLetter += 1;
			bCanPushBack = true;
		}
		else if(IsNumber(cTemp))
		{
			m_iNumber += 1;
			bCanPushBack = true;
		}
		if (bCanPushBack == true)
		{
			m_strSub += buffer;
		}
		return bCanPushBack;
	}
};

bool GetMaxLenSubStr(const char* pSrc, vector<SubString>& vecSubString)
{
	vecSubString.clear();
	if (pSrc == NULL)
	{
		return false;
	}
	const char* pStart = pSrc;
	const char* pCurPos = pStart;

	map<unsigned int,vector<SubString>> mapSupStr;
	while (*pStart != 0)
	{
		pCurPos = pStart;
		SubString strTemp;
		while (*pCurPos != 0)
		{
			bool bPushBack = strTemp.PushBackLetter(*pCurPos++);
			if (bPushBack != true)
			{
				break;
			}
		}
		if (strTemp.CheckSubStrFormat())
		{
			mapSupStr[strTemp.Getlength()].push_back(strTemp);
		}
		//pStart++;
		while( IsNumber(*pStart) && IsNumber(*(++pStart)) );
		while( IsLetter(*pStart) && IsLetter(*(++pStart)) );
	}
	if (!mapSupStr.empty())
	{
		map<unsigned int,vector<SubString>>::iterator iTerResult = mapSupStr.end();
		iTerResult--;
		vecSubString = iTerResult->second;
	}
	return !vecSubString.empty();
}


int main()
{
    char strTotal[] = "3345s435sfsf4534524534gaaaaaaaaaaaaaaaaa43444444434g43534535453dfgdf4335g43534535453g4333g43534535453fd4534gd33tg4534533453fegdfgdfg435345fdgg44gdrgdgdg5t5t";
	vector<SubString> vecSubString;
	GetMaxLenSubStr(strTotal, vecSubString);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值