1.遍历字符串中的每一个字符时,判断当前字符的状态,并且根据前一个字符的值,进行判断。这是基本的架构和方法。
2.特别需要注意的是最后一个字符的处理。应当将其单独列出来进行判断和比较。
例如:求出字符创中的最长连续数字子串:
1.首先判断当前字符是否为数字;如果是,判断前一个字符是否为数字,根据前一个字符是否是数字进行分别处理。在这里面需要特别注意到的是,如果遍历过程即将结束,最后一个字符是数字时,应该单独将其提取出来进行判断处理。
if(inputstr[i]>='0'&&inputstr[i]<='9')
{
if(begin == false)
{
tempStart = i;
begin = true;
count++;
}
else
{
tempEnd = i;
count++;
}
if((inputstr[i+1] == '\0')&&(count>maxLen))
{
maxLen = count;
start = tempStart;
end = tempEnd;
}
}
2.如果当前字符不是数字字符,那么根据前一个字符是否为数字进行处理。
else
{
if((begin == true)&&(count>maxLen))
{
maxLen = count;
start = tempStart;
end = tempEnd;
}
begin = false;
count = 0;
}
整个程序的代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
//查找字符串中连续最长的数字串
int continuemax(char *outputstr, char *inputstr)
{
//最大连续数字串的长度
int maxLen = 0;
//最大连续数字串的起始位置
int start = 0;
//最大连续数字串的结束位置
int end = 0;
//临时记录每一次遍历时,新的数字子串的起始位置的参数
int tempStart = 0;
//临时字符指针,指向outputstr的起始位置
char *temp = outputstr;
//临时记录每一次遍历时,新的数字子串的起始位置的参数
int tempEnd = 0;
//标记值,标记前一个字符是否为数字,这个标记值,对于连续子串的判断非常有帮助
bool flag = false;
//数字子串的计数器
int count = 0;
//开始遍历字符串
for(int i=0;inputstr[i];i++)
{
//判断当前字符是否为数字
if(inputstr[i]>='0'&&inputstr[i]<='9')
{
//如果前一个字符不是数字
if(flag == false)
{
tempStart = i;
flag = true;
count++;
}
//如果前一个字符是数字
else
{
tempEnd = i;
count++;
}
//如果此字符是最后一个数字了,这时候需要单独提取出来进行判断
if((inputstr[i+1] == '\0')&&(count>maxLen))
{
maxLen = count;
start = tempStart;
end = tempEnd;
}
}
//如果当前字符不是数字
else
{
//判断前一个字符是否为数字,如果是数字的话需要进行判断,其数字子串跟前一个比是否更长
if((flag == true)&&(count>maxLen))
{
maxLen = count;
start = tempStart;
end = tempEnd;
}
//判断完后,因为这个字符不是数字,所以将其标记值标记为false;
flag = false;
count = 0;
}
}
for(int i = start;i <= end;i++)
{
*temp = inputstr[i];
temp++;
}
*temp = '\0';
return maxLen;
}
int main(int argc, char* argv[])
{
char inputstr[] = "abcd12345ed125ss123456789";
char *outputstr = new char[strlen(inputstr) + 1];
memset(outputstr, 0, strlen(inputstr) + 1);
cout<<continuemax(outputstr, inputstr)<<" "<<outputstr<<endl;
delete [] outputstr;
system("PAUSE");
return 0;
}