给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
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);
}